0

iOS アプリで sqlite データベースからデータを読み込もうとしています。アプリを実行すると、データベースを開くことができますが、ログ ファイルに「準備ステートメントに問題があります」というメッセージが表示されます。準備ステートメントの何が問題なのかわかりませんこれが私のコードです-

-(NSString *)dataFilePath{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    return [documentsDirectory stringByAppendingPathComponent:kFilename];
}

私が持っているviewDidLoadで -

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    myarray = [[NSMutableArray alloc]init];

    sqlite3 *database;
    if(sqlite3_open([[self dataFilePath]UTF8String], &database)!=SQLITE_OK){
        sqlite3_close(database);
       NSAssert(0, @"Failed to open database");
    }

    const char *createSQL = @"SELECT ID, TITLE FROM FIRST ORDER BY TITLE;"; //first is the table in the database
    sqlite3_stmt *sqlStmt;
    if(sqlite3_prepare_v2(database, [createSQL UTF8String], -1, &sqlStmt, nil)!=SQLITE_OK){
        NSLog(@"Problem with prepare statement"); //this is where the code gets stuck and I don't know why
    }else{

        while(sqlite3_step(sqlStmt)==SQLITE_ROW){
            NSInteger number = sqlite3_column_int(sqlStmt, 0);
            NSString *title = [NSString stringWithUTF8String:(char *) sqlite3_column_text(sqlStmt, 1)];
            [myarray addObject:title];
        }
        sqlite3_finalize(sqlStmt);
    }
    sqlite3_close(database);
}
4

3 に答える 3

1

あなたが試すことができるいくつかのこと。

  1. アプリをクリーンアップし、シミュレーターまたはデバイスから削除して、新しいコピーを再度インストールしてみて、機能するかどうかを確認します。

  2. ターミナルでDBを開き、そこでsqlステートメントを実行してみます。目的の出力が得られているかどうかを確認します。

于 2012-06-28T12:08:35.620 に答える
1

準備ステートメントが失敗した場合は、単に「準備ステートメントの問題」を報告するのではなく、エラー メッセージを取得してみてください。

NSLog(@"%s Prepare failure '%s' (%1d)", __FUNCTION__, sqlite3_errmsg(database), sqlite3_errcode(database));

これにより、問題のより良い兆候が得られる場合があります。

私が過去に見た問題は、データベースが見つからない可能性があることです (バンドルに含まれていなかった、名前のタイプミスなどのsqlite3_openため)。これsqlite3_openは成功しますが、問題のテーブルは、新しく作成された空白のデータベースには見つかりません。以下よりも優れてsqlite3_openいます。

sqlite3 *database;
if (sqlite3_open_v2([[self dataFilePath] UTF8String], &database, SQLITE_OPEN_READWRITE, NULL) != SQLITE_OK) {
    sqlite3_close(database); // not sure you need to close if the open failed
    NSAssert(0, @"Failed to open database");
}

そうすれば、データベースが見つからない場合に警告が表示されます。ただし、既に行っている場合sqlite3_openは、データベースが空の可能性があるため、シミュレーターをリセットするか、デバイスからアプリを削除してから、sqlite3_open_v2.

于 2012-06-28T15:11:16.453 に答える
0

nil を NULL に変更してみてください。また、SQL ステートメントを const char として定義してみてください。

....

const char *sql = "SELECT ID, TITLE FROM FIRST ORDER BY TITLE";
sqlite3_stmt *sqlStmt;

if(sqlite3_prepare_v2(database, sql, -1, &sqlStmt, NULL)!=SQLITE_OK){

....
于 2012-06-28T10:41:08.177 に答える