【问题标题】:Sqlite Prepare Failed: no such table<tablename>Sqlite 准备失败:没有这样的表<表名>
【发布时间】:2012-10-05 12:41:17
【问题描述】:

我已经创建了 sqlite 数据库。

我在我的应用程序中添加了这个 sqlite 文件,但是当我在模拟器中运行应用程序并检查文档目录中 sqlite 文件的路径时,我在文档目录的路径上打开了 sqlite 文件,当时我创建的表没有出现。

在本地副本中我也可以在我的项目文件夹中看到表格我可以看到表格但是在模拟器的路径上我看不到表格

所以在我的控制台中它显示了错误:

Sqlite Prepare 失败:没有这样的表

【问题讨论】:

  • 您的 sqilte 数据库文件没有被复制到文档目录中,因此您得到的错误很明显。
  • 我可以在该路径看到我的 sqlite 文件,但没有。此 sqlite 文件中的表为零。所以我得到了这个错误。
  • 正如@HarshIT 所说,您的DB 没有复制到文档目录,请从iphone-simulatorclean 项目中删除该应用程序。如果仍然没有解决,那么remove-referenceDB 来自project-exploreradd 再次。
  • 如何从项目浏览器中删除数据库的引用?我不知道,因为我是 iphone 新手
  • 只需选择并删除它,它会要求删除引用并移动到垃圾箱......

标签: iphone objective-c sqlite


【解决方案1】:

我在下面的回复假设您的数据库格式正确且功能正常。您可以通过命令行轻松测试。在我自己的应用程序中,所有标签栏控制器应用程序,我将数据库访问代码放在应用程序委托中。 appdelegate中的两个方法如下:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions (NSDictionary *)launchOptions {
    [self createEditableCopyOfDatabaseIfNeeded];
    [self.window setRootViewController:rootController]; 
    [window makeKeyAndVisible];
    return YES;
}

还有:

- (void)createEditableCopyOfDatabaseIfNeeded {

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDir = [paths objectAtIndex:0];

    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSError *error;
    NSString *dbPath =[documentsDir stringByAppendingPathComponent:@"dbName.sqlite"];
    BOOL success = [fileManager fileExistsAtPath:dbPath];
    if(!success)
    {
        NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"dbName.sqlite"];
        success = [fileManager copyItemAtPath:defaultDBPath toPath:dbPath error:&error];

        if (!success)
            NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]);
    }
}

【讨论】:

  • 实际上我已经实现了相同的代码,但是在 appdelegate 中我忘了写 [self createEditableCopyOfDatabaseIfNeeded];在 applicationDidFinishLaunchingWithOptions 方法中。
【解决方案2】:

如果您已经尝试了所有方法,但仍然出现此错误.. 即使您尝试重置 iOS 模拟器。尝试在 iOS 模拟器中安装应用,然后手动卸载(选择 Home 并长选应用图标并删除它),然后重置模拟器。

我不知道为什么,但我尝试了其他所有方法,花了几个小时把头撞在墙上。然后就成功了。

【讨论】:

    【解决方案3】:

    您可以将 sqlite 文件放入您的 xcode 项目中并像这样定位它:

    NSString *pathToSQL = [[NSBundle mainBundle]
    pathForResource:@"sqlname" ofType:@"sql"];
    

    【讨论】:

    • 我在控制台中找到了路径,在该路径上我有 .sqlite 文件,但这个 sqlite 文件包含零个表。
    • 那么它不是客观的c问题,而是您的文件的问题。您是否在某处加载了您的 qlite 文件以检查它是否正确?
    【解决方案4】:

    确保sql文件的“Target Membership”设置正确,让项目“看到”它:

    1) 点击Xcode左侧窗格中的sql文件

    2) 打开/显示文件检查器(右窗格)

    3) 在“Target Membership”下,确保“check”为“checked”

    就是这样。希望,这就是你要找的。有任何问题可以联系我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-16
      • 2013-03-07
      • 1970-01-01
      • 2015-04-20
      • 1970-01-01
      相关资源
      最近更新 更多