2

sqlite3 データベースからの読み取りに問題があります。

-(void) readMessengesFromDatabase {
    sqlite3 *database;

    messenges = [[NSMutableArray alloc] init];

    if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) {
        NSLog(@"Connection OK");
        const char *sqlStatement = "select * from MessagesData";
        sqlite3_stmt *compiledStatement;
        if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) NSLog(@"connect to table OK");    else NSLog(@"connect to table FALSE");
        if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) { //не проходит условие
            NSLog(@"Connection to table OK");
            while(sqlite3_step(compiledStatement) == SQLITE_ROW) {
                NSLog(@"Read rows OK");
                NSString *dbMessageID = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 0)];
                NSString *dbMessageText = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 1)];
                NSString *dbMessageDate = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 2)];
                NSString *dbMediaOrNot = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 3)];

                Message *messege = [[Message alloc] initWithName:dbMessageText messageID:dbMessageID messageDate:dbMessageDate mediaOrNot:dbMediaOrNot];

                [messenges addObject:messege];

                [messege release];
            }
        }
        sqlite3_finalize(compiledStatement);
    }
    sqlite3_close(database);    
}

私の最初の NSLog は、データベースへのどの接続が問題ないかを示しています。しかし、次のステップは「select * from MessagesData」で、if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) NSLog(@"connect to table OK"); else NSLog(@"connect to table FALSE");「connect to table FALSE」と表示されます。ターミナルでデータベースのテーブルから選択しようとすると、「データベースファイルを開けません」というエラーが発生しました。私の間違いはどこですか?コードに問題はありません...

4

3 に答える 3

2

返されたエラー コードsqlite3_prepare_v2を出力すると、問題の診断がはるかに簡単になります。数値はこのページにあります。

int errorCode = sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL);
if(errorCode != SQLITE_OK) {
    NSLog(@"Connect to table failed: %d", errorCode); 
}

ただし、sqlite3コマンド ライン ツールでデータベースから選択することさえできない場合は、ファイルが存在し、読み取り可能で、正しい形式であることを確認することをお勧めします。

シミュレーターでエラーを再現してみてください (再現できない場合は、Organizer などを使用してデータベース ファイルをコンピューターにコピーします)。を使用してクエリを実行してみてくださいsqlite3(試したことは知っていますが、次のことを確認してください)。

メッセージが表示される場合はError: file is encrypted or is not a database、データベース ファイルが破損していることを意味します。が表示された場合Error: no such table:は、データベースが存在しないか、であるか、単にテーブルがないことを意味します。(質問のように)Error: unable to open database(クエリを実行するときではなく、sqliteを開くときにこれを取得する)を取得した場合、それはsqliteがファイルを読み取れないことを意味します(たとえば、パーミッション)。

于 2012-04-09T11:59:47.213 に答える
1

urデータベースが接続できないと推測しています。ここから私の答えを試してください...

私はここでいくつかのことを述べました、そして私はあなたがちょうどうまくいくと信じています

うまくいったことを教えてください

于 2012-04-09T14:02:01.740 に答える
0

テーブルが存在するかどうかを確認するコードを記述します。クエリ選択を実行する前に、存在しない場合はテーブルを作成することを確認する必要があります....

NSLog(@"接続OK");

 sqlite3_exec(database,"CREATE TABLE IF NOT EXISTS MessagesData (ID INTEGER PRIMARY KEY AUTOINCREMENT ,"
                             "FirstName TEXT,LastName TEXT"));

   const char *sqlStatement = "select * from MessagesData";

それがうまくいくなら、それを好きにしてください

于 2012-04-09T12:06:35.727 に答える