FMDB SQLite 没有出现在我的设备中

Posted

技术标签:

【中文标题】FMDB SQLite 没有出现在我的设备中【英文标题】:FMDB SQLite doesn't show up in my device 【发布时间】:2012-07-31 19:21:42 【问题描述】:

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

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

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

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

提前谢谢你。

【问题讨论】:

这很奇怪,因为没有关于如何做到这一点的技巧。如果它在模拟器上工作,它通常在设备上工作。您能否提供更多关于您如何知道它没有在设备上生成的信息,或者显示您打开数据库的代码等? 【参考方案1】:

确保 (a) 将 db 包含在包中(请参阅 here 以获取可以找到“复制包资源”的屏幕快照); (b) programmatically copy db 从包到文档。然后你可以从那里打开它。

为什么它可以在您的模拟器上运行而不是在设备上运行有点好奇。我只能想象您正在从某个固定路径读取,而不是以编程方式检索应用程序的 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];

如果您在模拟器中运行此程序,则可以继续检查模拟器的捆绑包和 Documents 文件夹(如果运行不正常),以确保一切都在应有的位置。您的模拟器文件夹类似于“~/Library/Application Support/iPhone Simulator/5.1/Applications/”(将 5.1 替换为您正在使用的模拟器的任何版本)。您可能需要通过在Terminal 命令行窗口中运行chflags nohidden ~/Library 来取消隐藏Library 文件夹(如果还没有)。无论如何,您可以使用 Mac OS X 的 sqlite3 命令打开模拟器的数据库,并确保您的表正常。

一个常见的错误是无法正确programmatically copy 数据库,因此open 方法将创建一个空白数据库,而executeQuery 将失败说找不到表。

告诉我你发现了什么。

【讨论】:

+1 非常感谢罗伯特!你说的对。问题仅在于将文件复制到 Documents 文件夹中。我使用了您在另一篇文章中提到的代码,一切正常!再次感谢您的帮助。一直以来,使用 SQLite 都是一次很棒的学习。希望我能给 +100 :) TY..

以上是关于FMDB SQLite 没有出现在我的设备中的主要内容,如果未能解决你的问题,请参考以下文章

何时关闭 SQLite 数据库(使用 FMDB)

FMDB 出错 - 列名未知

SQLite FMDB 创建表 - 初学者 iOS

执行 [FMDatabaseQueue inDatabase:] 后出现错误,因为周围至少有一个打开的结果集?

FMDB 如何让 sqlite 更简单 iOS?

在使用 FMDB 执行 sqlite 查询时受到打击