2012-03-28 59 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); 
     } 
相关问题