web-dev-qa-db-ja.com

SQLite「データベースディスクイメージの形式が正しくありません」

SQLiteデータベースが破損しているアプリで問題が発生しています。以前は奇妙なケースがありましたが、iOS7.1のリリース後にはもっと一般的になっているようです。

私はここで見つけることができるMatteo BertozziによるSQLiteラッパーを使用しています: https://github.com/ConnorD/simple- sqlite

データベースが破損し、エラーdatabase disk image is malformedが出力されます。一部のクエリは実行できますが、既存のデータが台無しになります。

私は高低を検索しましたが、解決策を見つけることができません。これはiOSの更新後に一般的な問題になりつつあるため、ここの誰かがいくつかのアイデアを持っていることを願っています。

私はこれらの修復コマンドを試しました:

[sqlite executeNonQuery:@"pragma integrity_check"];
[sqlite executeNonQuery:@"reindex nodes"];
[sqlite executeNonQuery:@"reindex pristine"];

そして、出力は次のとおりです。

SQLite Step Failed: database disk image is malformed
SQLite Prepare Failed: unable to identify the object to be reindexed
 - Query: reindex nodes
SQLite Prepare Failed: unable to identify the object to be reindexed
 - Query: reindex pristine`

さらに掘り下げてみると、この問題が見つかりました: CoreDataとiOS7:永続ストアの動作が異なります これはiOS7以降のSQLiteの問題に言及しています。

NSPersistentStoreの使い方がわからないので、[sqlite executeNonQuery:@"pragma journal_mode = DELETE"];を実行してみたところ、SQLite Step Failed: unknown errorと表示されました。

他の誰かがこれを経験していますか、それとも私を正しい方向に向けますか?

それまでの間、このNSPersistentStoreは私が潜在的にやるべきことだと感じています。それを調査する必要があります。

編集:

私が見つけたところによると、データベースが更新されない場合にのみNSPersistentStoreを使用します。これは、私の定期的なものです。

データベースを開く方法は次のとおりです。

sqlite = [[Sqlite alloc] init];

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"HomeOpenDatabase8.sql"];

if (![sqlite open:writableDBPath]) {
    NSLog(@"DB Not Writable");
    return;
} else {
    NSLog(@"All good");
}

だから私はpragma journal_mode = DELETEをこのように設定する方法を見つける必要があると思います..?

編集2:

journal_modeを使用していないので、Core Dataに関係しているとは確信していません。図面に戻ります。

私にとって最大のフラグは、iOs 7.1がリリースされた直後にこのエラーがポップアップすることです。確かに、偶然ではありません。デバイスで問題を再現しようと試み続けます。

10
Batnom

FMDBを使用するiOS7.0.6でもこの問題が発生しました。 Macにコピーし、次のコマンドを使用して修復しました。

http://www.dosomethinghere.com/2013/02/20/fixing-the-sqlite-error-the-database-disk-image-is-malformed/

私のデータベースダンプは200MBとかなり大きかったので、Hexfiendを使用してトランザクションとロールバックコマンドをカットしました。

2
malhal