【问题标题】:Error compiling sqlite project in Xcode在 Xcode 中编译 sqlite 项目时出错
【发布时间】:2012-07-16 22:06:57
【问题描述】:

我正在编写以下尝试连接数据库的代码,但我在这一点上卡住了:

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

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

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

【问题讨论】:

  • 可能是微不足道的,但你是否包含了库?

标签: iphone ios xcode sqlite compilation


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

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

  3. 1234563 t 打开数据库。
  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 程序员的最后忠告。

【讨论】:

  • 顺便说一句,我认为通过你开始的第一个 sqlite 项目是有意义的,但从长远来看,如果你继续使用 sqlite(而不是 Core Data),你应该认真检查出FMDB。一旦你使用了 FMDB,你就再也不想回到这些烦人的sqlite3_XXX 函数了。但首先对 sqlite 有一点了解是有意义的。
猜你喜欢
  • 2016-10-09
  • 1970-01-01
  • 2018-11-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-21
  • 2017-01-07
  • 2018-12-30
相关资源
最近更新 更多