In letzter Zeit habe ich eine Menge Beschwerden über die HTC Desire-Serie erhalten, die beim Aufrufen von SQL-Anweisungen fehlschlägt. Ich habe Berichte von Anwendern mit Protokollschnappschüssen erhalten, die das Folgende enthalten.
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
gefolgt von meiner App, die im Grunde genommen in Flammen aufgeht, weil der Aufruf zum Öffnen der Datenbank zu einem schwerwiegenden Laufzeitfehler führt, der sich darin äußert, dass der Cursor offen gelassen wird. Es sollte nicht ein Cursor an dieser Stelle sein, wie wir versuchen, es zu öffnen.
Dieses Problem tritt nur beim HTC Desire HD und Z auf. Mein Code funktioniert im Wesentlichen wie folgt (ein wenig geändert, um den Problembereich zu isolieren).
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);
}
Leider ist dieses Telefon nur im Vereinigten Königreich erhältlich und ich habe keins in meinem Bestand. Ich erhalte nur Berichte dieses Typs von der HTC Desire-Serie. Ich weiß nicht, was sich geändert hat, da dieser Code bisher ohne Probleme funktioniert hat. Gibt es etwas, das ich übersehe?