最近、私はHTC Desireシリーズについて多くの苦情を受けており、SQL文を呼び出す際には失敗しています。私は、以下を含むログスナップショットを持つユーザーからのレポートを受け取りました。呼び出しが開いたままにされているカーソルとして現れ、重大なランタイムエラーでデータベースの結果を開くためにので私のアプリは基本的に炎で燃焼させ、その後SqliteがHTC Desire HDで問題を解決するHD
I/Database(2348): sqlite returned: error code = 8, msg = statement aborts at 1: [pragma journal_mode = WAL;]
E/Database(2348): sqlite3_exec to set journal_mode of /data/data/my.app.package/files/localized_db_en_uk-1.sqlite to WAL failed
。この時点でカーソルを開こうとしているときはカーソルを置いてはいけません。
これはHTC Desire HDとZでのみ発生します。私のコードは基本的に次のことを行います(問題の領域を分けるために少し変更しました)。
SQLiteDatabase db;
String dbName;
public SQLiteDatabase loadDb(Context context) throws IOException{
//Close any old db handle
if (db != null && db.isOpen()) {
db.close();
}
// The name of the database to use from the bundled assets.
String dbAsset = "/asset_dir/"+dbName+".sqlite";
InputStream myInput = context.getAssets().open(dbAsset, Context.MODE_PRIVATE);
// Create a file in the app's file directory since sqlite requires a path
// Not ideal but we will copy the file out of our bundled assets and open it
// it in another location.
FileOutputStream myOutput = context.openFileOutput(dbName, Context.MODE_PRIVATE);
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer)) > 0) {
myOutput.write(buffer, 0, length);
}
// Close the streams
myOutput.flush();
// Guarantee Write!
myOutput.getFD().sync();
myOutput.close();
myInput.close();
// Not grab the newly written file
File fileObj = context.getFileStreamPath(dbName);
// and open the database
return db = SQLiteDatabase.openDatabase(fileObj.getAbsolutePath(), null, SQLiteDatabase.OPEN_READONLY | SQLiteDatabase.NO_LOCALIZED_COLLATORS);
}
悲しいことに、この電話は英国でのみ利用可能で、私は自分の在庫に1つもありません。私はHTC Desireシリーズからこのタイプのレポートを取得しています。私は、このコードが何の問題もなく働いていたので、何が変わったのか分かりません。私が紛失しているものはありますか?
これはショットの価値があるように聞こえる、私は明日これを間違いなく試みるでしょう。それが動作する場合は、チェックボックスとビールを取得します。 –
モルモットを発見し、それは働いた。ありがとう!それは同時に素晴らしいと悲しかった。 –
@Greg: "それは働いた" ... 'SQLiteDatabase.OPEN_READONLY'を削除することを意味しますか?今後、この問題を防ぐために、私たちが終了しようとしているCompatibility Test Suiteのギャップを示していることをお知らせください。ありがとう! – CommonsWare