sqlite prepare语句错误 - 没有这样的表

nni*_*lax 2 sqlite iphone objective-c ios

我的sqlite prepare语句有些困难.我得到一个错误,说我的桌子不存在,虽然我已经在多个地方检查了它,它确实存在,所以我很困惑.

  • 该文件位于正确的iPhone模拟器应用程序文件夹中
  • 该文件将添加到我的项目中,并可在项目导航器中查看
  • 它也在我的构建阶段 - Copy Bundle Resources区域.
  • 我已经清理并再次开始运行.
  • 数据库存在并运行我的sql语句让我得到我期望的结果.

    - (NSMutableArray *) getMyWorkout{
    NSMutableArray *workoutArray = [[NSMutableArray alloc] init];
    @try {
    NSFileManager *fileMgr = [NSFileManager defaultManager];
    
    NSString *dbPath = [[[NSBundle mainBundle] resourcePath ]stringByAppendingPathComponent:@"IOSDB.sqlite"];
        NSLog(@"Db path is %@",dbPath);
    BOOL success = [fileMgr fileExistsAtPath:dbPath];
    
    if(!success) {
        NSLog(@"Cannot locate database file '%@'.", dbPath);
    }
    
    if(!(sqlite3_open([dbPath UTF8String], &db) == SQLITE_OK)){
        sqlite3_close(db);
        NSLog(@"Failed to open database with message '%s'.", sqlite3_errmsg(db));
    }
    
    const char *sql = "SELECT Id, type, difficulty, duration, description FROM workoutTbl";
    sqlite3_stmt *sqlStatement;
    
    if(sqlite3_prepare(db, sql, -1, &sqlStatement, NULL) != SQLITE_OK){
    
    NSLog(@"%s Prepare failure '%s' (%1d)", __FUNCTION__, sqlite3_errmsg(db), sqlite3_errcode(db));
    }        //...
    
    Run Code Online (Sandbox Code Playgroud)

当我运行它时,我得到文件路径和以下错误

    2013-02-01 18:07:08.060 TriShake[9251:c07] -[MyWorkoutList getMyWorkout] Prepare failure 'no such table: workoutTbl' (1)
Run Code Online (Sandbox Code Playgroud)

我已经检查了其他这些问题,但一直无法找到解决方案

据我所知,如果数据库路径不存在,sqlite3_open()会为您创建一个空数据库,但我知道它存在,因此会产生挫败感.您可以给我的任何帮助或指导将不胜感激.

Rob*_*Rob 6

就你眼前的问题而言,它会变得简单.

  1. 你说你已经"清理并再次构建",但你真的从模拟器中删除了旧的应用程序吗?手动删除应用程序,或者更简单,只需从"iOS模拟器"菜单中选择"重置内容和设置"即可完全重置模拟器.有时Xcode不知道要复制哪些文件(特别是在这种情况下,你在设备上运行它可能会改变模拟器包中文件的时间戳!)

  2. 再次运行该应用程序.

  3. 如果应用程序无法按预期工作,请从Mac打开模拟器文件夹中的数据库,并检查数据库以确保表格在那里并且正如您预期的那样.因此,导航到应用程序,打开捆绑包(您可能必须选择"显示包内容"选项),确认数据库的存在,但同样重要的是,在您喜欢的Mac sqlite3工具中打开数据库的这个特定副本选择并确认那里有桌子的存在.

让我们知道你发现了什么.同样,它必须是简单的,例如:

  • 也许重建应用程序的过程并非重新安装所有内容; 我偶尔遇到Xcode选择在我的模拟器上安装时不重新复制某些内容的问题;

  • 也许您的项目中的数据库被意外地放在子目录中,更糟糕的是,您可能有两个副本位于不同的目录中;

  • 也许您的Xcode项目中的数据库丢失(或者在表或文件的名称中有拼写错误或(例如,在设备的情况下),文件名大写不正确);

  • 等等.

对于很多这些错误,在完全重置模拟器本身之前,您不会注意到该问题.它可能有一百万件小事,但希望完全重置模拟器并重新开始将帮助您找到问题.它总是简单的东西,当涉及到此类问题.


其他一些小的观察:

  1. 您可能不应该从捆绑包中打开数据库.以编程方式将其从捆绑包复制到该Documents文件夹,然后从那里打开数据库.我知道这似乎是不必要的,但这有很多原因很重要(如果db在应用程序运行期间发生变化,如果db意外地在你身上创建,请不要让Xcode对变化的事情感到困惑(即使只是文件时间戳)在Xcode背后改变的捆绑等等)

  2. 如果需要数据库,则应sqlite3_open_v2使用SQLITE_OPEN_READWRITE或SQLITE_OPEN_READONLY作为标志(但包括SQLITE_OPEN_CREATE).它会让sqlite有机会为你创建一个空白数据库,或以其他方式修改它,所以永远不要给它机会.