在Xcode中访问数据库时,SQLite不会准备查询

我是一个初学者的iPhone开发者,试图从Xcode 4.3中的sqlite数据库中获取信息。 我的数据库(名为DB_Info.sqlite)与我的.h和.m文件位于同一个目录中,并且还将数据库拖到Xcode中左侧栏的文件夹部分。

你能不能快速看看我的代码,让我知道我的错误在哪里? 我已经使用NSLog来确定问题发生的位置,最后是if语句,并且写在注释中。 提前谢谢你!

#import <sqlite3.h> @implementation Player { sqlite3 *DB_Info; NSString *databasePath; NSString *docsDir; NSArray *dirPaths; } -(Player*)createPlayer:(NSString*)playerName { dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); docsDir = [dirPaths objectAtIndex:0]; databasePath = [[NSString alloc] initWithString: [docsDir stringByAppendingPathComponent: @"DB_Info.sqlite"]]; const char *dbpath = [databasePath UTF8String]; sqlite3_stmt *statement; if (sqlite3_open(dbpath, &DB_Info) == SQLITE_OK) { //works fine NSString *querySQL = [NSString stringWithFormat: @"SELECT * FROM playerlist WHERE fullName=\"%@\"", playerName]; const char *query_stmt = [querySQL UTF8String]; if (sqlite3_prepare_v2(DB_Info, query_stmt, -1, &statement, NULL) == SQLITE_OK) { //PROBLEM: This is where the problem is, and the if statement never goes through //....rest of code here } else { NSLog(@"Error"); } } 

首先,不要只说“错误”,loggingSQL错误消息

 NSLog(@"%s SQL error '%s' (%1d)", __FUNCTION__, sqlite3_errmsg(database), sqlite3_errcode(database));` 

它会告诉你到底发生了什么问题。 人们第一次使用SQL项目的一个常见错误是没有find该表。 如果是这样,请继续阅读。 (如果没有,请随时忽略其余部分。)

其次,您正在查找您的文档文件夹中的数据库。 你有没有明确地将它从你的包中复制到你的Documents文件夹? 还是你编程创build它? 但是,如果您预先准备好了,它将不会存在于“文档”文件夹中,除非您将其复制到该文件夹​​中。

第三,我也build议你考虑使用sqlite3_open_v2而不是sqlite3_open 。 你正在检查,看看是否SQLITE_OK,但这可能是一个虚假的安全感。 sqlite3_open将创build一个数据库,如果它不存在,这显然不是你的意图。 你的应用程序应该大概是复制数据库从数据包或创build数据库和表之前,你得到这种方法(你没有显示,所以我不知道你是否这样做)。 无论如何, sqlite3_open_v2函数不会创build数据库,除非您通过包含SQLITE_OPEN_CREATE显式请求SQLITE_OPEN_CREATE 。 所以,像下面这样的东西不会创build数据库,如果没有find:

 if (sqlite3_open_v2(dbpath, &DB_Info, SQLITE_OPEN_READWRITE, NULL) == SQLITE_OK) { 

如果你没有为你创build一个空白数据库,我build议你通过模拟器菜单上的“重置内容和设置”重置你的模拟器,或者显式删除应用程序,这样任何可能创build的空白数据库都可以被删除。 如果您在设备上运行此应用程序,请删除该应用程序并重新安装。

第四,如果数据库已经提前创build,你确认数据库已经包含在“Copy Bundle Resources”设置中了吗? 例如:

复制捆绑资源

第五,如果你在模拟器上运行应用程序,你可以随时浏览模拟器的文件结构,并确保你的文件在你认为的位置。 您也可以运行Mac OS的sqlite程序来检查模拟器正在使用的数据库,以确保一切正常。 你甚至可以在模拟器使用的db中testing你的SQL,这对于诊断目的可能是有用的。 (或者,如果您不喜欢基于Mac文本的sqlite程序,也可以购买/下载graphics工具,例如Base 。)在做到这一点之前,您可能首先需要configurationMac,以便轻松浏览模拟器的文件需要你启动terminal程序,并发出命令:

 chflags nohidden ~/Library 

然后你可以浏览到“〜/ Library / Application \ Support / iPhone \ Simulator / 5.1 / Applications /”,然后浏览你有的各种应用程序,并确保你的db文件在那里。