2012-07-16 89 views
0

我正在下面的代码是试图连接到数据库,但我卡住了这一点:错误编译sqlite的项目在Xcode

#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

可能是微不足道的,但你有没有包括图书馆? – 2012-07-16 22:09:51

回答

3
  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,可能导致问题(崩溃?)如果你打电话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程序员的最后一个建议。

+1

顺便说一句,我觉得很有道理通过你开始你的第一个项目的SQLite猛击,但长期来看,如果你留在sqlite的(而不是核心数据),你应该认真检查出[FMDB(HTTPS: //github.com/ccgus/fmdb)。一旦你使用FMDB,你永远不会想回到这些恼人的'sqlite3_XXX'函数。但首先要对sqlite有点熟悉是有道理的。 – Rob 2012-07-16 23:09:54

+0

只是忘了添加sqlite项目:)谢谢! – 2012-07-17 08:07:26