2011-04-05 200 views
0

重命名SQL數據庫當提及到數據庫表我通常使用的語法如下:my_database_name.my_table_nameandroid系統

我試圖做的Android相同的,但我無法理解如何命名的數據庫。

你會像在Sqlite3客戶端中一樣執行這個SQL嗎?即

ATTACH "my_database_file" AS my_database_name; 

以下是我在我的onCreate方法嘗試:

db.execSQL("Attach 'hq_db' AS hq_db;"); 

,但我得到這個錯誤:

04-05 11:13:35.676: ERROR/AndroidRuntime(860): Caused by: android.database.sqlite.SQLiteException: cannot ATTACH database within transaction: Attach 'hq_db' AS hq_db; 

如何在Android上執行的以外的SQL語句一個交易,使這項工作?

編輯:它也可能有一些這樣與超constuctor,雖然超類構造函數字符串將文件名(其中工作正常),似乎沒有別的:

private class databaseOpenHelper extends SQLiteOpenHelper { 

     public q_player_databaseOpenHelper() { 
      super(MyApp.getContext(), "my_db_file", null, 1); 
     } 

     @Override 
     public void onCreate(SQLiteDatabase db) { 

      db.execSQL("Attach 'my_db_file' AS my_db_name;"); 
      db.execSQL("PRAGMA foreign_keys=ON;"); 

     } 

注:我已將該代碼刪除,因此它適合我的問題

+0

正如我記得只有一個數據庫爲您的應用程序創建。因此,您不必通過數據庫名稱訪問表。 – 2011-04-05 11:23:24

+0

弗拉基米爾,你是對的,但我可能需要在將來添加數據庫(或者有相同數據庫的兩個版本,它們將具有不同的數據庫名稱,但具有相同的表名),因此可以使用命名來避免衝突 – tjb 2011-04-05 11:28:34

回答

0

您需要在啓動任何類型的事務之前調用db.execSQL("ATTACH 'hq_db' AS hq_db;");。先做附件,然後開始交易。

您是否打電話給beginTransaction或執行SQL,在嘗試附加其他數據庫之前開始事務?

+0

既不,是我嘗試執行的第一條SQL語句,它失敗了,所以沒有其他SQL正在運行(至少不是我明確指出的) – tjb 2011-04-05 11:27:05

+0

在您的onCreate中,您通過調用db.execSQL(「Attach」 my_db_file'AS my_db_name;「);'。所有這些都是讓你通過兩個名字 - my_db_file和my_db_name來訪問數據庫。 SQLite中可以連接到另一個數據庫的數量有限制 - 我的猜測是在Android上,這是1.在onCreate中刪除您的初始附件。 – 2011-04-05 11:57:50

0

您可能正在使用AutoCommit = 0創建數據庫。這會將您置於事務中,以便在每次INSERT後不需要寫入數據庫文件。但這也意味着你無法連接到另一個數據庫。創建數據庫,設置AutoCommit = 1,ATTACH,然後設置AutoCommit = 0。