我正在处理以下尝试连接到数据库的代码,但我仍然坚持这一点:
#import "ToDos.h"
#import "AppDelegate.h"
static sqlite3 *database = nil;
@implementation ToDos
@synthesize todoID, title, descr, isDirty, isDetailViewHydrated;
- (void) dealloc {
}
+ (void) getInitialDataToDisplay:(NSString *)dbPath {
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
if (sqlite3_open([dbPath UTF8String], database) == SQLITE_OK) {
// const char *sql = "select * from todos";
// sqlite3_stmt *selectstmt;
// if(sqlite3_prepare_v2(database, sql, -1, &selectstmt, NULL) == SQLITE_OK) {
//
// while(sqlite3_step(selectstmt) == SQLITE_ROW) {
//
// NSInteger primaryKey = sqlite3_column_int(selectstmt, 0);
// ToDos *coffeeObj = [[ToDos alloc] initWithPrimaryKey:primaryKey];
// coffeeObj.title = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 1)];
//
// coffeeObj.isDirty = NO;
//
// [appDelegate.todosArray addObject:coffeeObj];
// // [coffeeObj release];
// }
// }
}
else
sqlite3_close(database); //Even though the open call failed, close the database connection to release all the memory.
}
- (id) initWithPrimaryKey:(NSInteger) pk {
// [super init];
todoID = pk;
isDetailViewHydrated = NO;
return self;
}
@end
问题接缝在指针......
static sqlite3 *database = nil;
和
if (sqlite3_open([dbPath UTF8String], database) == SQLITE_OK) {
但是这是尝试启动应用时的错误消息
相同的代码在教程中有效:)
答案 0 :(得分:3)
作为La bla bla said,您似乎没有将sqlite3库添加到项目中。在Xcode左侧的项目文件导航树中,单击目标(树的顶部)。查看目标设置时,单击“构建阶段”,转到“使用库链接二进制文件”,单击“+”按钮,然后将libsqlite3.0.dylib
添加到项目中。
您需要sqlite3_open([dbPath UTF8String], &database);
。您正在更新database
指针,因此请不要忘记&符号。
此外,在失败时,调用sqlite3_close
没有意义,因为如果你用database
调用sqlite3_close
,sqlite3_prepare
可能仍然是NULL,可能会导致问题(崩溃?) NULL数据库指针因为无法打开数据库。
在评论代码中,您正在执行sqlite3_step
和sqlite3_finalize
,但您没有做最终的sqlite3_open
。批评评论代码是不公平的,但我只是想确保你不要忘记时间的到来。 :)
顺便说一句,sqlite3_open_v2([dbPath UTF8String], &database, SQLITE_OPEN_READWRITE, NULL);
会为你创建数据库,如果不存在的话。如果您不想这样做(即如果您只想在成功找到先前创建的数据库时成功),请改用sqlite3_open
。很多初次使用的用户都有一个数据库,忘记将它包含在目标的“复制包资源”列表中,当sqlite3_open_v2
表明他们已成功打开数据库时实际上它可能刚刚创建了新数据库找不到你想要的那个。但是,如果您想打开数据库来创建数据库,请忽略我刚才所说的内容。但如果没有,请考虑sqlite3_errmsg
。
最后,一旦您成功打开数据库,我建议您在任何后续命令失败时始终检查sqlite3_errmsg
命令。通常一些随机的sqlite3命令不起作用,程序员仍然摸不着头脑,但他们忘记检查{{1}}。我知道这不是问题,而只是新sqlite3程序员的最后一条忠告。