1

再次,我需要别人的帮助。我正在按照以下教程进行 SQLite 与 FMDB 包装器的连接:

http://www.icodeblog.com/2011/11/04/simple-sqlite-database-interaction-using-fmdb/

在上面的教程中,一切(创建数据库和表,插入,删除)都是以编程方式完成的,但在模拟器中一切正常,但是当我使用 SQLite Manager 插件对数据库进行任何插入时(在 iOS 中以编程方式创建) ,它没有出现在我的测试设备中。我有什么遗漏(比如将文件复制到我的包中)吗?这真的让我发疯。我对这些完全陌生..有人可以帮我吗?

PS:我知道我可以使用 Core Data,但由于某些原因,我必须为这个应用程序使用 SQLite。任何帮助将不胜感激。

先感谢您。

4

1 回答 1

2

确保 (a) 将 db 包含在包中(请参阅此处以获取“复制包资源”所在位置的屏幕快照);(b)以编程方式将db 从 bundle 复制到文档。然后,您可以从那里打开它。

为什么它可以在您的模拟器上运行而不是在设备上运行有点好奇。我只能想象您正在从某个固定路径读取,而不是以编程方式检索应用程序的 Documents 文件夹?

更新:

我建议检查您的各种返回码并确保一切正常。

我已经获取了您的代码示例并(a)检查了创建的结果FMDatabase;(b) 检查结果open;(c) 检查结果FMResultSet,包括 sqlite 错误信息的显示;(d) 关闭结果集:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docsPath = [paths objectAtIndex:0];
NSString *path = [docsPath stringByAppendingPathComponent:@"DADatabase.sqlite"];

FMDatabase *database = [FMDatabase databaseWithPath:path];
NSAssert(database, @"Unable to create FMDatabase object");

NSLog(@"%@", database);

BOOL success = [database open];
NSAssert(success, @"Unable to open database");

FMResultSet *results = [database executeQuery:@"SELECT * FROM DrugList"];
NSAssert(results, @"Unable to create result set: %@", [database lastErrorMessage]);

while([results next]) {
    NSString *name = [results stringForColumn:@"Drugname"];
    [arrayToLoadDiseases addObject:name];
}

[results close]; 

[database close];

如果你在你的模拟器中运行它,你可以继续检查模拟器的包和文档文件夹,如果事情不正确,只是为了确保一切都在它应该在的地方。您的模拟器文件夹类似于“~/Library/Application Support/iPhone Simulator/5.1/Applications/”(将 5.1 替换为您正在使用的模拟器的任何版本)。您可能必须通过在命令行窗口中Library运行来取消隐藏您的文件夹(如果您还没有) 。无论如何,您可以使用 Mac OS X 的命令打开模拟器的数据库并确保您的表正常。chflags nohidden ~/LibraryTerminalsqlite3

一个常见的错误是未能以编程方式正确复制数据库,因此该open方法将创建一个空白数据库,并且executeQuery会失败,说找不到表。

让我知道你发现了什么。

于 2012-07-31T20:51:52.350 回答