ios – sqlite准备语句

我想从一个iOS应用程序中的数据库中读取数据。 当我运行应用程序,它能够打开数据库,但在日志文件中显示消息 – “与准备声明的问题”。 我不知道我的准备声明有什么问题这是我的代码 –

-(NSString *)dataFilePath{ NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; return [documentsDirectory stringByAppendingPathComponent:kFilename]; } 

viewDidLoad中我有 –

 - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. myarray = [[NSMutableArray alloc]init]; sqlite3 *database; if(sqlite3_open([[self dataFilePath]UTF8String], &database)!=SQLITE_OK){ sqlite3_close(database); NSAssert(0, @"Failed to open database"); } const char *createSQL = @"SELECT ID, TITLE FROM FIRST ORDER BY TITLE;"; //first is the table in the database sqlite3_stmt *sqlStmt; if(sqlite3_prepare_v2(database, [createSQL UTF8String], -1, &sqlStmt, nil)!=SQLITE_OK){ NSLog(@"Problem with prepare statement"); //this is where the code gets stuck and I don't know why }else{ while(sqlite3_step(sqlStmt)==SQLITE_ROW){ NSInteger number = sqlite3_column_int(sqlStmt, 0); NSString *title = [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStmt, 1)]; [myarray addObject:title]; } sqlite3_finalize(sqlStmt); } sqlite3_close(database); } 

如果您的准备陈述失败,而不是仅报告“准备陈述问题”,请尝试检索错误消息,例如,

 NSLog(@"%s Prepare failure '%s' (%1d)", __FUNCTION__, sqlite3_errmsg(database), sqlite3_errcode(database)); 

这可能会给你一个更好的指示问题。

我以前见过的一个问题是数据库可能找不到(因为它没有包含在包中,名称中的拼写错误等),但是如果标准sqlite3_open函数不存在,标准sqlite3_open函数将会创build它,因此sqlite3_open将会成功,但是在新创build的空白数据库中将不会find有问题的表。 比sqlite3_open更好的是:

 sqlite3 *database; if (sqlite3_open_v2([[self dataFilePath] UTF8String], &database, SQLITE_OPEN_READWRITE, NULL) != SQLITE_OK) { sqlite3_close(database); // not sure you need to close if the open failed NSAssert(0, @"Failed to open database"); } 

这样你会得到一个警告,如果没有find数据库。 但是如果你已经完成了sqlite3_open ,那么你可能会有一个空白的数据库,所以你可能需要重置你的模拟器和/或从你的设备中删除应用程序,然后用sqlite3_open_v2进行尝试。

几件事你可以尝试。

  1. 清理你的应用程序,从模拟器或设备中删除,并尝试再次安装一个新的副本,看看它是否工作。

  2. 在terminal中打开你的数据库并尝试在那里运行你的sql语句。 检查你是否得到所需的输出。

尝试将nil更改为NULL。 另外,尝试将SQL语句定义为一个常量字符。

 .... const char *sql = "SELECT ID, TITLE FROM FIRST ORDER BY TITLE"; sqlite3_stmt *sqlStmt; if(sqlite3_prepare_v2(database, sql, -1, &sqlStmt, NULL)!=SQLITE_OK){ ....