0

私は Xcode 4.3 で sqlite データベースから情報を取得しようとしている初心者の iPhone 開発者です。データベース (DB_Info.sqlite という名前) を .h および .m ファイルと同じディレクトリに置き、データベースを Xcode の左側のバーのフォルダー セクションにドラッグしました。

私のコードを簡単に見て、私の間違いがどこにあるか教えてください。NSLogs を使用して、最後の if ステートメントで問題が発生した場所を特定し、それをコメントに記述しました。よろしくお願いします!

#import <sqlite3.h>
@implementation Player
{
    sqlite3 *DB_Info;
    NSString *databasePath;
    NSString *docsDir;
    NSArray *dirPaths;
}

-(Player*)createPlayer:(NSString*)playerName
{        

    dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    docsDir = [dirPaths objectAtIndex:0];
    databasePath = [[NSString alloc] initWithString: [docsDir stringByAppendingPathComponent: @"DB_Info.sqlite"]];
    const char *dbpath = [databasePath UTF8String];
    sqlite3_stmt *statement;

    if (sqlite3_open(dbpath, &DB_Info) == SQLITE_OK) { //works fine

        NSString *querySQL = [NSString stringWithFormat: @"SELECT * FROM playerlist WHERE fullName=\"%@\"", playerName];

        const char *query_stmt = [querySQL UTF8String];

        if (sqlite3_prepare_v2(DB_Info, query_stmt, -1, &statement, NULL) == SQLITE_OK) { //PROBLEM: This is where the problem is, and the if statement never goes through
        //....rest of code here
        } else {
        NSLog(@"Error");
        }
}
4

1 に答える 1

3

まず、単に「エラー」と言うのではなく、SQLエラーメッセージをログに記録します

NSLog(@"%s SQL error '%s' (%1d)", __FUNCTION__, sqlite3_errmsg(database), sqlite3_errcode(database));` 

何が悪いのかを正確に教えてくれます。初めてのSQLプロジェクトでよくあるエラーは、テーブルが見つからないことです。もしそうなら、読み続けてください。(そうでない場合は、この残りの部分を無視してかまいません。)

次に、Documentsフォルダーでデータベースを探しています。ある時点で、バンドルからドキュメントフォルダに明示的にコピーしましたか?それともプログラムで作成しましたか?ただし、事前に準備しておけば、そこにコピーするまでドキュメントフォルダにはありません。

sqlite3_open_v2第三に、の代わりに使用することを検討することもお勧めしますsqlite3_open。それがSQLITE_OKであるかどうかを確認していますが、それは誤った安心感を与えている可能性があります。sqlite3_openデータベースがない場合は、データベースが作成されますが、これは明らかにあなたの意図ではありません。このメソッドに到達する前に、アプリはおそらくバンドルからデータベースをコピーするか、データベースとテーブルを作成する必要があります(そして、それを表示していないので、それを行っているかどうかはわかりません)。とにかく、データベースが存在しない場合、sqlite3_open_v2関数は、を含めて明示的に要求しない限り、データベースを作成しませんSQLITE_OPEN_CREATE。したがって、次のようなものが見つからない場合、データベースは作成されません。

if (sqlite3_open_v2(dbpath, &DB_Info, SQLITE_OPEN_READWRITE, NULL) == SQLITE_OK) {

空白のデータベースが作成された可能性が低い場合は、シミュレーターのメニューの[コンテンツと設定のリセット]からシミュレーターをリセットするか、アプリを明示的に削除することをお勧めします。これにより、作成された可能性のある空白のデータベースが作成される可能性があります。除去される。これをデバイスで実行している場合は、アプリを削除して再インストールしてください。

第4に、データベースが事前に作成されている場合、データベースが「バンドルリソースのコピー」設定に含まれていることを確認しましたか?例えば:

バンドルリソースをコピーする

第5に、シミュレーターでアプリを実行している場合は、いつでもシミュレーターのファイル構造を参照して、ファイルが思いどおりの場所にあることを確認できます。Mac OSsqliteプログラムを実行して、シミュレーターが使用しているデータベースを調べて、すべてが正常であることを確認することもできます。シミュレーターが使用するデータベースでSQLをテストすることもできます。これは、診断目的に役立ちます。(または、Macテキストベースのプログラムが気に入らない場合は、 Basesqliteなどのグラフィカルツールを購入/ダウンロードすることもできます。)これを行う前に、まずMacを構成して、シミュレーターを簡単に参照できるようにすることをお勧めします。ファイルでは、ターミナルプログラムを起動し、次のコマンドを発行する必要があります。

chflags nohidden ~/Library

次に、「〜/ Library / Application \ Support / iPhone \ Simulator / 5.1 / Applications /」を参照し、使用しているさまざまなアプリを参照して、dbファイルがそこにあることを確認します。

于 2012-07-23T01:39:53.237 に答える