我正在尝试从ios应用程序中的sqlite数据库中读取数据。当我运行应用程序时,它能够打开数据库但在日志文件中显示消息 - “准备语句问题”。我不知道我的准备陈述有什么问题这是我的代码 -
-(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);
}
答案 0 :(得分:1)
你可以试试几件事。
清理您的应用,从模拟器或设备中删除&尝试再次安装新的副本,看看它是否有效。
在终端&中打开您的数据库尝试在那里运行你的sql语句。检查你是否得到了所需的输出。
答案 1 :(得分:1)
如果您的prepare语句失败,请尝试检索错误消息,而不是仅报告“准备语句问题”,例如,
NSLog(@"%s Prepare failure '%s' (%1d)", __FUNCTION__, sqlite3_errmsg(database), sqlite3_errcode(database));
这可能会让您更好地指出问题。
我过去看到的一个问题是可能找不到数据库(因为它没有包含在捆绑包中,名称中有拼写错误等),但标准sqlite3_open
函数将创建如果它不存在,那么sqlite3_open
将成功,但是在新创建的空白数据库中找不到有问题的表。优于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");
}
这样,如果找不到数据库,就会收到警告。但是,如果您已经完成sqlite3_open
,则可能会有一个空白数据库,因此您可能需要重置模拟器和/或从设备中删除应用,然后再使用sqlite3_open_v2
进行尝试。
答案 2 :(得分:0)
尝试将nil更改为NULL。另外,尝试将SQL语句定义为const char。
....
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){
....