0

データベースからデータを読み込む iOS アプリの機能があります。関数は非常に単純です。

-(void) readCategories {
    sqlite3 *database;

    if([[NSFileManager defaultManager] fileExistsAtPath:databasePath]){
        if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) {
            const char *sqlStatement = "SELECT * FROM Categories ORDER BY name COLLATE NOCASE ASC";
            sqlite3_stmt *compiledStatement;
            int errorCode = sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL);

            if(errorCode == SQLITE_OK) {
                while(sqlite3_step(compiledStatement) == SQLITE_ROW) {
                    [categories addObject:[NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 1)]];
                }
            } else {
                 NSLog(@"Error reading categories. Code: %d, message: '%s'", errorCode,sqlite3_errmsg(database));
            }
            sqlite3_finalize(compiledStatement);
            sqlite3_close(database);
        } else {
            NSLog(@"Error opening DB");
        }
    } else {
        NSLog(@"DB does not exist.");
    }
}

問題は、errorCode が常に SQLITE_ERROR であることです。ドキュメントによると、「SQL エラーまたはデータベースがありません」です。与えられたメッセージは次のとおりです:「そのようなテーブルはありません: カテゴリ」

今、自分のコンピューター上のデータベース ファイルを見ると、テーブルが明らかに存在しています。まったく同じクエリを実行することもでき、正しく動作します。

誰が何がうまくいかないのかについて何か考えを持っていますか?

ありがとう。

4

2 に答える 2

3

[[NSFileManager defaultManager] fileExistsAtPath:databasePath]チェックを追加する前にこのコードを実行したことがあるsqlite3_open場合、データベースが見つからなかった場合、標準によって空のデータベースが作成されます。そう、

  1. シミュレーターのメニューの「コンテンツと設定のリセット...」からシミュレーターをリセットします。これにより、過去に作成された不要なデータベース ファイルが消去されます。(デバイスでこれを行っている場合は、アプリを削除してから再インストールしてください。)

  2. sqlite3_open見つからない場合、コマンドは空のデータベースを作成します。安全のために、将来的には、sqlite3_open_v2代わりに使用してください。これは、空のデータベースを作成することはありません。

    if (sqlite3_open_v2([databasePath UTF8String], &database, SQLITE_OPEN_READWRITE, NULL) != SQLITE_OK) {
        // handle opening error here
    }
    

    を使用sqlite3_open_v2することで、オープン プロセス中にデータベースが作成されないようにすることができます。

  3. それでも問題が解決しない場合は、マシンのシミュレーターのディレクトリ、つまり「~/Library/Application Support/iPhone Simulator」に移動してください。(ターミナル ウィンドウで次のコマンドを入力して、ライブラリ フォルダーを再表示する必要がある場合があります。

    chflags nohidden ~/Library
    

    (Xcode プロジェクトのバージョンではなく) そこにあるデータベースを調べて、データベースに期待どおりのすべてのテーブルがあるかどうかを確認してください。

  4. このすべてを行っても、データベースがシミュレーター/デバイスにコピーされていない場合は、ターゲットのビルド フェーズ設定を設定して、データベースが [バンドル リソースのコピー] を介して含まれるようにしてください。

  5. 他の人が示唆しているように、 を取得するたびにSQLITE_ERROR、常に のような方法でエラーの詳細を確認してくださいNSLog(@"%s SQLITE_ERROR '%s' (%1d)", __FUNCTION__, sqlite3_errmsg(database), sqlite3_errcode(database));

于 2012-07-03T14:08:24.853 に答える
0

したがって、バグは、データベース ファイルをコピーしていないことでした。なぜそうならなかったのか、いまだにわかりません。幸いなことに、データベース ファイルをプログラムで作成できるという贅沢があります。そうすることで問題は解決しました。ただし、ファイルがコピーされない理由はわかりません。

于 2012-07-03T15:09:10.573 に答える