1

このコードで問題に直面しています。iPhone と iPad Mini では問題なく動作していますが、大きい iPad ではエラー メッセージが表示されます。何か理由はありますか?

コード:

- (sqlite3_stmt *)executeQuery:(char *)aQuery {
    NSString *dbPath = [[NSUserDefaults standardUserDefaults] objectForKey:kDBPath];
    sqlite3_stmt *statement = NULL;
    sqlite3 *database;
    if (sqlite3_open((char *)[dbPath UTF8String], &database) == SQLITE_OK) {
        if (sqlite3_prepare_v2(database, aQuery, -1, &statement, NULL) != SQLITE_OK) {
            //Here is the point: on iPad Mini and iPhone it works fine, but on the normal iPad it can't execute this query
            NSLog(@"Error on SQL - (sqlite3_stmt *)executeWithReturn:(char *)aQuery");
            statement = NULL;
        }
    } else {
        NSLog(@"Error on Open database");
    }
    return statement;
}

LLDB からの出力:

(lldb) print (BOOL)[[NSFileManager defaultManager] isWritableFileAtPath:dbPath]
(BOOL) $0 = YES
(lldb) print (char *)aQuery
(char *) $1 = 0x1f0a1000 "select CodAplicacao, CodLocalidade, Nome, Desc, DataCriacao, Editando from Aplicacao_en"

何か案は?

よろしく!

編集:

「データベース ディスク イメージの形式が正しくありません」というエラーが表示されます。インターネットで修正方法を見つけることができませんでした。

4

1 に答える 1

2

sqlite3_errmsg修正された質問で、 「データベース ディスク イメージの形式が正しくありません」と報告されていることをお知らせください。これは、データベースが破損していることを示しています。これは、以前の日付で何らかのデータベース操作を実行中にアプリがクラッシュした場合に発生する可能性があります。

これは、次の SQL を実行して確認できます。

PRAGMA integrity_check;

そのプロセスを実行したい場合は、データベースをデバイスから Mac にコピーして戻し (Xcode のオーガナイザーを使用して [デバイス] セクションに移動)、選択した Mac SQLite データベース ツールを使用できます (最悪の場合、コマンド行sqlite3プログラム)、前のPRAGMAコマンドを実行します。SELECTこれをプログラムで実行することもできます (ステートメントのような結果セットを返します)。

問題は、問題が報告されることをかなり確信しているということです。簡単な解決策は、データベースを再構築することです (たとえば、データベースを削除し、最初にバンドルからコピーした場合はもう一度削除し、プログラムで作成した場合はそのプロセスを繰り返します)。

データベースからユーザー データを回復しようと決心した場合は、Sergei Dorogin のテクニカル ブログで概説されているプロセスに従うことを検討できます - SQLiteException "database disk image is malformed"。彼はこれを別のプラットフォーム用に書いていますが、基本的なプロセスはおそらくここで適用できます。つまり、絶対にユーザー データを回復する必要がない限り、そのプロセスはおそらく不要です。

つまり、そのデバイスのデータベースが破損しているため、再構築する必要があります。アプリを削除するだけで(データベースがDocumentsフォルダーにある場合は、アプリを削除してそのフォルダーを空にする必要があります)、アプリを再インストールすれば問題ありません。


ログステートメントを次から変更します。

NSLog(@"Error on SQL - (sqlite3_stmt *)executeWithReturn:(char *)aQuery");

NSLog(@"Error on SQL - %s: %s", __FUNCTION__, sqlite3_errmsg(database));

これにより、何が問題なのかを示す有益なエラー メッセージが表示されます。

通常、この種の問題は、その特定のデバイスのデータベースのバージョンが原因で発生します。デバイス自体に関連する可能性はほとんどありません。

おそらく、アプリがある時点で空のデータベースを作成したため、テーブルが見つからない可能性があります。Xcode のオーガナイザーを使用している場合は、[デバイス] セクションに移動し、アプリ フォルダーを Mac にコピーしてから、Mac 上のデータベースを調べて、データベースが期待どおりであることを確認できます。

于 2013-04-11T15:50:48.880 に答える