0

私はDBに接続しようとしている次のコードに取り組んでいますが、この点で立ち往生しています:

#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のプロジェクトファイルナビゲータツリーで、ターゲット(ツリーの上部)をクリックします。ターゲット設定を確認したら、[ビルドフェーズ]をクリックし、[バイナリとライブラリのリンク]に移動し、[+]ボタンをクリックしてlibsqlite3.0.dylib、プロジェクトに追加します。

  2. 必要sqlite3_open([dbPath UTF8String], &database);です。ポインタを更新してdatabaseいるので、そのアンパサンドを忘れないでください。

  3. また、失敗した場合は、おそらくまだNULLであるsqlite3_closeため、呼び出しに意味がありません。データベースを開くことができなかったためにNULLデータベースポインタを使用して呼び出すと、問題(クラッシュ?)が発生する可能性があります。databasesqlite3_close

  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プログラマーのための最後の助言にすぎません。

于 2012-07-16T22:38:53.217 に答える