gpt4 book ai didi

iphone - 在 Xcode 中编译 sqlite 项目时出错

转载 作者:行者123 更新时间:2023-11-28 20:33:13 24 4
gpt4 key购买 nike

我正在处理以下试图连接到数据库的代码,但我卡在了这一点上:

#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) {

但这是尝试启动应用程序时的错误消息

enter image description here

相同的代码在教程中并且有效:)

最佳答案

  1. 作为La bla bla said ,看起来您还没有将 sqlite3 库添加到您的项目中。在左侧 Xcode 的项目文件导航树中,单击目标(​​树的顶部)。查看目标设置时,单击“Build Phases”,转到“Link Binary With Libraries”,单击“+”按钮,然后将 libsqlite3.0.dylib 添加到您的项目中。

  2. 您需要 sqlite3_open([dbPath UTF8String], &database);。您正在更新您的 database 指针,所以不要忘记那个 & 符号。

  3. 此外,如果失败,调用 sqlite3_close 毫无意义,因为 database 可能仍为 NULL,如果调用 可能会导致问题(崩溃?) code>sqlite3_close 使用 NULL 数据库指针,因为无法打开数据库。

  4. 在您的注释代码中,您正在执行 sqlite3_preparesqlite3_step,但您没有执行最后的 sqlite3_finalize。批评注释代码是不公平的,但我只是想确保你在时机成熟时不会忘记这一点。 :)

  5. 顺便说一下,如果数据库不存在,sqlite3_open 会为您创建数据库。如果您不想这样做(即,如果您只希望在成功找到之前创建的数据库时成功),则使用 sqlite3_open_v2([dbPath UTF8String], &database, SQLITE_OPEN_READWRITE, NULL);反而。许多初次使用数据库的用户忘记将其包含在目标的“复制捆绑资源”列表中,并且在 sqlite3_open 提示他们已成功打开数据库时感到困惑,而实际上它可能已经当找不到您想要的数据库时,刚刚创建了一个新数据库。但是,如果您希望打开数据库来创建数据库,请忽略我刚才所说的。但如果没有,请考虑 sqlite3_open_v2

  6. 最后,一旦您成功打开数据库,我鼓励您在任何后续命令失败时始终检查 sqlite3_errmsg 命令。很多时候,一些随机的 sqlite3 命令不起作用,让程序员摸不着头脑,但他们忘记检查 sqlite3_errmsg。我知道这不是这里的问题,而只是给新的 sqlite3 程序员的最后一条忠告。

关于iphone - 在 Xcode 中编译 sqlite 项目时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11513286/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com