2013-10-28 98 views
1

我和使用sqlite數據庫的應用程序。數據庫具有存儲在Transactions表中的交易數據。我想添加一個額外的字段到交易表中,同時保留以前數據庫的舊數據。sqlite升級數據庫與表中的額外字段和保留舊數據

我已經在SqliteOpenHelper類中使用了onUpgrade方法。我試圖將Transactions表名更改爲OldTrasnsactions,然後重新創建交易表並從OldTransactions複製數據。

Android在編譯Alter語句時表示「Transactions」表不存在。我正在執行onUpgrade時正確地增加版本號。

有誰知道我在做什麼錯?

下面是錯誤和SqliteOpenHelper類。

NB事務中額外的新領域是C_TRANSACTIONS_DRIVER

10-28 14:33:12.550: E/AndroidRuntime(3171): FATAL EXCEPTION: IntentService[SendOutstandingTransactions] 
    10-28 14:33:12.550: E/AndroidRuntime(3171): android.database.sqlite.SQLiteException: no such table: TABLETRANSACTIONS (code 1): , while compiling: ALTER TABLE TABLETRANSACTIONS RENAME TO OldTABLETRANSACTIONS 
    10-28 14:33:12.550: E/AndroidRuntime(3171):  at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method) 
    10-28 14:33:12.550: E/AndroidRuntime(3171):  at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:909) 
    10-28 14:33:12.550: E/AndroidRuntime(3171):  at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:520) 
    10-28 14:33:12.550: E/AndroidRuntime(3171):  at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588) 
    10-28 14:33:12.550: E/AndroidRuntime(3171):  at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58) 
    10-28 14:33:12.550: E/AndroidRuntime(3171):  at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31) 
    10-28 14:33:12.550: E/AndroidRuntime(3171):  at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1719) 
    10-28 14:33:12.550: E/AndroidRuntime(3171):  at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1650) 
    10-28 14:33:12.550: E/AndroidRuntime(3171):  at com.carefreegroup.rr3.LoginValidate$DBHelper.onUpgrade(LoginValidate.java:643) 
    10-28 14:33:12.550: E/AndroidRuntime(3171):  at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:257) 
    10-28 14:33:12.550: E/AndroidRuntime(3171):  at android.database.sqlite.SQLiteOpenHelper.getReadableDatabase(SQLiteOpenHelper.java:188) 
    10-28 14:33:12.550: E/AndroidRuntime(3171):  at com.carefreegroup.rr3.LoginValidate.queryAllFromCarer(LoginValidate.java:275) 
    10-28 14:33:12.550: E/AndroidRuntime(3171):  at com.carefreegroup.rr3.SendOutstandingTransactions.onHandleIntent(SendOutstandingTransactions.java:63) 
    10-28 14:33:12.550: E/AndroidRuntime(3171):  at android.app.IntentService$ServiceHandler.handleMessage(IntentService.java:65) 
    10-28 14:33:12.550: E/AndroidRuntime(3171):  at android.os.Handler.dispatchMessage(Handler.java:99) 
    10-28 14:33:12.550: E/AndroidRuntime(3171):  at android.os.Looper.loop(Looper.java:158) 
    10-28 14:33:12.550: E/AndroidRuntime(3171):  at android.os.HandlerThread.run(HandlerThread.java:60) 
    10-28 14:33:12.560: E/EmbeddedLogger(508): App crashed! Process: com.carefreegroup.rr3 
    10-28 14:33:12.565: E/EmbeddedLogger(508): App crashed! Package: com.carefreegroup.rr3 v13 (2.0.5e) 
    10-28 14:33:12.570: E/EmbeddedLogger(508): Application Label: CareFree 



private class DBHelper extends SQLiteOpenHelper { 

     // database name and version number 
     public static final String DB_NAME = "carefreemobiledb.db"; 
     public static final int DB_VERSION = 51; 

     // table names 
     public static final String TABLETRANSACTIONS = "transactions"; 



     public DBHelper() { 
      super(context, DB_NAME, null, DB_VERSION); 
     } 

     @Override 
     public void onCreate(SQLiteDatabase db) { 
      String sqlToCreateTransactionsTable = String 
        .format("create table %s (%s INTEGER primary key, %s TEXT, %s TEXT, %s TEXT, %s TEXT, %s TEXT," 
          + " %s TEXT, %s TEXT, %s INT, %s TEXT, %s TEXT)", 
          TABLETRANSACTIONS, C_ID, C_TYPE, C_COMPANY_ID, 
          C_PERSON_ID, C_NAME, C_TAG_ID, C_STATUS, 
          C_TAG_SCAN_TIME, C_TAG_SENTSERVER_TIME, 
          C_TRANSACTIONS_LATITUDE, C_TRANSACTIONS_LONGITUDE); 

      db.execSQL(sqlToCreateTransactionsTable); 
      Log.e(TAG, "oncreate " + sqlToCreateTransactionsTable); 



     } 

     @Override 
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 

//   db.execSQL("drop table if exists " + TABLETRANSACTIONS); 
//   db.execSQL("drop table if exists " + TABLECARER); 
//   db.execSQL("drop table if exists " + TABLETRANSACTIONSMAP); 
//   db.execSQL("drop table if exists " + TABLEPHONE); 
//   db.execSQL("drop table if exists " + TABLECOMPANYID); 
//   db.execSQL("drop table if exists " + TABLEBACKGROUNDSERVICES); 
//   db.execSQL("drop table if exists " + TABLEMESSAGE); 
//   db.execSQL("drop table if exists " + TABLEDUPLICATETRANSACTIONS); 
//   db.execSQL("drop table if exists " + TABLECACHEDROTA); 
//   Log.e(TAG, "onUpgrade dropped all tables apart from message and transactions"); 

      db.execSQL("ALTER TABLE TABLETRANSACTIONS RENAME TO OldTABLETRANSACTIONS"); 

      db.execSQL("CREATE TABLE TABLETRANSACTIONS(C_ID INTEGER PRIMARY KEY, C_TYPE TEXT," + 
        " C_COMPANY_ID TEXT,C_PERSON_ID TEXT, C_NAME TEXT, C_TAG_ID TEXT, C_STATUS TEXT,C_TAG_SCAN_TIME TEXT, " + 
        "C_TAG_SENTSERVER_TIME INT,C_TRANSACTIONS_LATITUDE TEXT, C_TRANSACTIONS_LONGITUDE TEXT, C_TRANSACTIONS_DRIVER TEXT)"); 

      db.execSQL("INSERT INTO TABLETRANSACTIONS (C_ID, C_TYPE, C_COMPANY_ID, C_PERSON_ID, C_NAME, C_TAG_ID, C_STATUS, C_TAG_SCAN_TIME, " + 
       "C_TAG_SENTSERVER_TIME, C_TRANSACTIONS_LATITUDE, C_TRANSACTIONS_LONGITUDE, C_TRANSACTIONS_DRIVER) SELECT C_ID, C_TYPE, C_COMPANY_ID, " + 
       "C_PERSON_ID, C_NAME, C_TAG_ID, C_STATUS, C_TAG_SCAN_TIME, C_TAG_SENTSERVER_TIME, C_TRANSACTIONS_LATITUDE, C_TRANSACTIONS_LONGITUDE FROM OldTABLETRANSACTIONS"); 

      db.execSQL("DROP TABLE OldTABLETRANSACTIONS"); 


      Log.e(TAG, " SQLiteOpenHelper onUpgrade: finished copying old data to new transaction table"); 

      Toast.makeText(nfcscannerapplication, "SQLiteOpenHelper onUpgrade: finished copying old data to new transaction table", Toast.LENGTH_LONG); 
      //this.onCreate(db); 

     } 

    } 
+0

否,該錯誤信息不*不*說,交易表不存在。 –

回答

1

您的交易表的名稱似乎是「交易」,但你正在尋找的Java語句和SQL之間轉換的可能,因爲「TABLETRANSACTIONS」。與其他常量(如C_ID)一樣。

要麼改變所有的SQL語句來指代交易或使用常數值如下:

db.execSQL("ALTER TABLE "+TABLETRANSACTIONS+" RENAME TO Old"+TABLETRANSACTIONS); 
+0

感謝它現在工作正常 – turtleboy

+0

我有一個問題。一旦應用程序從版本1升級到版本2並且新的字段已經在版本2中創建,那麼我在版本3中做什麼?我是否像往常一樣創建交易表(如版本1),但與驅動程序字段?例如在版本3的sqlopenhelper類中,我是否會在onCreate方法中創建修改後的事務表,Android會從版本2升級到3? – turtleboy

+0

如果您沒有對錶格進行結構性更改,則無需執行任何操作。您可以檢查舊版本和新版本號,並根據這些版本之間所做的更改執行操作。 – Rajesh

相關問題