2013-10-28 85 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

相关问题