0

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

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

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

在此处输入图像描述

教程中的代码相同,它可以工作:)

4

1 回答 1

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

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

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

  4. 在您注释的代码中,您正在执行sqlite3_prepareand sqlite3_step,但您没有执行 final 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 程序员的最后建议。

于 2012-07-16T22:38:53.217 回答