[英]at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:188)
[英]ATTACH sqlite database in Android with SQLiteOpenHelper
我正在創建一個引用另一個數據庫中的鍵的數據庫。 基本上,我有一個數據導入,我想與將要更改的數據分開,但如果可能的話,我想通過FOREIGN KEY
引用其他鍵。 據我所知,我需要先附加數據庫以實現這一目標。 到目前為止,這是相關的代碼:
public class LogDatabaseHelper extends SQLiteOpenHelper {
private static final String DATABASE_NAME = "log.db";
private static final int DATABASE_VERSION = 1;
private String namesDb;
public LogDatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
namesDb=getNamesDbPath();
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("ATTACH DATABASE ? AS names",new String[]{namesDb});
StringBuilder query=new StringBuilder();
query.append("CREATE TABLE log (");
}
}
但是,這似乎不起作用,因為我收到以下錯誤:
11-21 17:35:58.176: E/SQLiteLog(9984): (1) statement aborts at 5: [ATTACH DATABASE ? AS names] cannot ATTACH database within transaction
11-21 17:35:58.176: D/AndroidRuntime(9984): Shutting down VM
11-21 17:35:58.176: W/dalvikvm(9984): threadid=1: thread exiting with uncaught exception (group=0x41a21700)
11-21 17:35:58.191: E/AndroidRuntime(9984): FATAL EXCEPTION: main
11-21 17:35:58.191: E/AndroidRuntime(9984): android.database.sqlite.SQLiteException: cannot ATTACH database within transaction (code 1)
11-21 17:35:58.191: E/AndroidRuntime(9984): at android.database.sqlite.SQLiteConnection.nativeExecuteForChangedRowCount(Native Method)
11-21 17:35:58.191: E/AndroidRuntime(9984): at android.database.sqlite.SQLiteConnection.executeForChangedRowCount(SQLiteConnection.java:734)
11-21 17:35:58.191: E/AndroidRuntime(9984): at android.database.sqlite.SQLiteSession.executeForChangedRowCount(SQLiteSession.java:754)
11-21 17:35:58.191: E/AndroidRuntime(9984): at android.database.sqlite.SQLiteStatement.executeUpdateDelete(SQLiteStatement.java:64)
11-21 17:35:58.191: E/AndroidRuntime(9984): at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1674)
11-21 17:35:58.191: E/AndroidRuntime(9984): at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1603)
11-21 17:35:58.191: E/AndroidRuntime(9984): at com.kd7uiy.hamfinder.LogDatabaseHelper.onCreate(LogDatabaseHelper.java:27)
11-21 17:35:58.191: E/AndroidRuntime(9984): at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:252)
11-21 17:35:58.191: E/AndroidRuntime(9984): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)
我怎樣才能做到這一點?
我找到了一種方法來使它工作,我並不是特別自豪,但它確實起到了作用。 如果在附加數據庫時無法處理事務,則首先結束事務。
db.setTransactionSuccessful();
db.endTransaction();
db.execSQL("ATTACH DATABASE ? AS names",new String[]{namesDb});
db.beginTransaction();
當我想在更新數據庫時附加數據庫時我遇到了同樣的問題,而我所做的只是在調用onUpdate()時以及在this.getReadableDatabase()或this.getWritableDatabase()之后更改靜態全局變量(實際上是調用onCreate / onUpdate方法的函數)我檢查全局變量的值並運行包含attach函數的整個代碼。 這樣你就不會在onCreate()或onUpgrade()方法中進行附加,而是在執行它們之后。
我不確定這種方法在指定的情況下是否可用,但我想我會提到如果其他人也遇到這個問題我是如何解決它的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.