2012-03-28 30 views
0

我的數據庫在我的應用程序工作正常,然後我添加了里程錶到數據庫。現在我得到一個表檢查沒有列命名里程錶:,而編譯:INSERT INTO檢查(codriver,里程錶,駕駛員,datetime,vehicle_id,狀態,vehicle_type)值(?,?,?,?,?,?,? ); logcat錯誤。我檢查了我的數據庫適配器和代碼工作正常,但出於某種原因,它不認可我添加的新列。 下面是從DBandroid中的sqlite無法識別新的列我添加了

@Override 
public void onCreate(SQLiteDatabase db) 
{ 
    String DATABASE_CREATE = "create table inspections (" 
      + "_id integer primary key autoincrement, " 
      + "vehicle_id string not null, " 
      + "vehicle_type string not null, " 
      + "datetime  integer not null, " 
      + "driver  string not null, " 
      + "codriver  string , " 
      + "status  integer not null, " 
      + "odometer  string not null " 
      + ");"; 
    db.execSQL(DATABASE_CREATE); 

} 

這裏的代碼是主分貝

public class SignalSetDBHelper extends SQLiteOpenHelper { 
private static final String DATABASE_NAME = "db"; 
private static final int DATABASE_VERSION = 1; 

public SignalSetDBHelper(Context context) { 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
} 

// Method is called during creation of the database 
@Override 
public void onCreate(SQLiteDatabase db) { 
    CurrentStateTable.onCreate(db); 
    HoursOfServiceTable.onCreate(db); 
    InspectionsTable.onCreate(db); 
    } 

// Method is called during an upgrade of the database, 
// e.g. if you increase the database version 
@Override 
public void onUpgrade(SQLiteDatabase database, int oldVersion, int newVersion) { 
    CurrentStateTable.onUpgrade(database, oldVersion, newVersion); 
    HoursOfServiceTable.onUpgrade(database, oldVersion, newVersion); 
    InspectionsTable.onUpgrade(database, oldVersion, newVersion); 
} 
} 

我可以包括更多的代碼的代碼,但可以肯定的錯誤是在上面的代碼中

更新: 卸載模擬器上的應用程序,仍然收到相同的錯誤。這裏是logcat 03-28 12:52:59.135:D/dalvikvm(331):GC_EXTERNAL_ALLOC在78ms中釋放了885個對象/ 63248字節 03-28 12:53:05.695:D/dalvikvm(331):GC_FOR_MALLOC釋放了4480對象/ 261760字節在73毫秒 03-28 12:53:17.065:W/KeyCharacterMap(331):無鍵盤爲ID 0 03-28 12:53:17.065:W/KeyCharacterMap(331):使用默認鍵盤映射: system/usr/keychars/qwerty.kcm.bin 03-28 12:53:28.615:I/Database(331):sqlite返回:錯誤代碼= 1,msg =表格檢查沒有列名稱里程錶 03-28 12 :53/28.715:D/dalvikvm(331):GC_FOR_MALLOC釋放8584個對象/ 420616字節在84ms中 03-28 12:53:28.715:電子數據庫(331):插入codriver時出錯=里程錶= 4321 driver = jim datetime = 1332964380 vehicle_id = ET 432 status = 1 vehicle_type = truck 03-28 12:53:28.715:電子/數據庫(331):android.database.sqlite.SQLiteException:表檢查沒有列命名里程錶:,編譯時:INSERT INTO檢查(codriver,里程錶,驅動程序,datetime,vehicle_id,狀態,vehicle_type)VALUES(?,?,?,?,?,?,?); 03-28 12:53:28.715 E/Database(331):at android.database.sqlite.SQLiteCompiledSql.native_compile(Native Method) 03-28 12:53:28.715:E/Database(331):at android .database.sqlite.SQLiteCompiledSql.compile(SQLiteCompiledSql.java:91) 03-28 12:53:28.715:E/Database(331):at android.database.sqlite.SQLiteCompiledSql。(SQLiteCompiledSql.java:64) 03 -28 12:53:28.715:E/Database(331):at android.database.sqlite.SQLiteProgram。(SQLiteProgram.java:80) 03-28 12:53:28.715:E/Database(331):at android (SQLiteStatus.java:36) 03-28 12:53:28.715:E/Database(331):at android.database.sqlite.SQLiteDatabase.compileStatement(SQLiteDatabase.java:1145) 03 -28 12:53:28.715:E /數據庫(331):在android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteD電子/數據庫(331):at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1410) 03-28 12:53:28.715: E/Database(331):at com.signalsetapp.database.InspectionDBAdapter.insertInspection(InspectionDBAdapter.java:54) 03-28 12:53:28.715:E/Database(331):at com.signalsetapp.report.save report.java:120) 03-28 12:53:28.715 E/Database(331):at java.lang.reflect.Method.invokeNative(Native Method) 03-28 12:53:28.715:E/Database (331):at java.lang.reflect.Method.invoke(Method.java:521) 03-28 12:53:28.715:E/Database(331):at android.view.View $ 1.onClick(View。 java:2067) 03-28 12:53:28.715:E/Database(331):at android.view.View.performClick(View.java:2408) 03-28 12:53:28.715:E/Database 331):在droid.view.View $ PerformClick.run(View.java:8816) 03-28 12:53:28.715:E/Database(331):at android.os.Handler.handleCallback(Handler.java:587) 03 -28 12:53:28.715:E /數據庫(331):在android.os.Handler.dispatchMessage(Handler.java:92) 03-28 12:53:28。715:E/Database(331):at android.os.Looper.loop(Looper.java:123) 03-28 12:53:28.715:E/Database(331):at android.app.ActivityThread.main ActivityThread.java:4627) 03-28 12:53:28.715:E/Database(331):at java.lang.reflect.Method.invokeNative(Native Method) 03-28 12:53:28.715:E/Database (331):at java.lang.reflect.Method.invoke(Method.java:521) 03-28 12:53:28.715:E/Database(331):at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller (ZygoteInit.java:868) 03-28 12:53:28.715:E/:53:28.715:E /數據庫(331):在dalvik.system.NativeStart.main(本地方法)

+0

我會嘗試完全卸載和調試開裂頭之前安裝。 – kosa 2012-03-28 18:56:30

+0

我會卸載什麼? – Aaron 2012-03-28 18:58:51

+0

你的應用程序(假設這是原生android應用程序),否則我很抱歉! – kosa 2012-03-28 19:02:34

回答

1

SQLiteOpenHelper正在看到您現有的數據庫,因此它不會調用onCreate

你需要卸載你的應用程序,以便擺脫現有的數據庫。

如果您處於開發模式,您可以將DATABASE_NAME更改爲db2作爲快速入門,但要記住在數據庫穩定後再更改它。

如果您想以最合適的方式執行此操作,可以增加DATABASE_VERSION,然後在onUpgrade中執行一些ALTER TABLE語句。

+0

我在模擬器上卸載了我的應用程序,但仍然收到相同的錯誤。有其他地方可以卸載嗎? – Aaron 2012-03-28 19:51:56

+0

我會嘗試db2 hack讓你現在去。此外,如果您使用ddms查看模擬器的文件系統(這在Eclipse中很好),您應該能夠找到該文件及其時間戳,可能位於/data/data/com.yourcompany目錄中。您也可以在Eclipse中使用「 - 」按鈕來手動刪除數據庫文件,這實際上是現在解決您的問題的好方法,現在我想到了它。 – louielouie 2012-03-28 20:01:15

+0

哪裏是「 - 」按鈕? – Aaron 2012-03-28 20:18:07

0

首次打開數據庫時然後SQLiteOpenHelperonCreate方法將調用,然後它將不會調用。

onUpgrade方法將在您升級數據庫版本時調用。 因此,假設您使用Sqlite版本1.0創建數據庫,然後爲了更新數據庫,您將不得不將數據庫版本更改爲大於數據庫的當前版本。在您的情況下,您將必須DATABASE_VERSION變量值更改爲2。

注: - 如果您更改數據庫的版本,則它會調用onUpgrade方法,因此將在此方法執行所有的代碼,所以你將不得不把只有那些查詢您想要的表更新否則,如果你把所有的表更新查詢,那麼它會更新你的數據庫的所有表,所以你可能會丟失舊數據庫中的所有數據。

+0

我更改了DATABASE_VERSION,並且仍然收到相同的錯誤 – Aaron 2012-03-28 20:03:38

0

我認爲處理這個最簡單的方法如下:

  1. 讓你想你的桌

  2. 增量數據庫版本的任何變化將表完全放入onUpgrade()

  3. 重新創建表/整個數據庫在onUpgrade()通過致電onCreate()方法。

  4. 運行您的應用程序,並且應該成功反映對數據庫或表的更改。

下面是代碼示例:

@Override 
     public void onCreate(SQLiteDatabase db) { 
      db.execSQL(CurrentStateTable_TABLE_CREATE); 
      Log.i(LOGTAG, "CurrentStateTable Table created"); 

      db.execSQL(HoursOfServiceTable_TABLE_CREATE); 
      Log.i(LOGTAG, "HoursOfServiceTable Table created"); 

      db.execSQL(InspectionsTable_TABLE_CREATE); 
      Log.i(LOGTAG, "InspectionsTable Table created"); 

     } 

     @Override 
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
      db.execSQL("DROP TABLE IF EXISTS " + CurrentStateTable); 
      db.execSQL("DROP TABLE IF EXISTS " + HoursOfServiceTable); 
      db.execSQL("DROP TABLE IF EXISTS " + InspectionsTable); 
      onCreate(db); 

      Log.i(LOGTAG, "Database successfully upgraded " + "from " + oldVersion + " to " + newVersion); 
     } 
相關問題