我的应用程序中的数据库工作正常,然后我在数据库中添加了里程表。现在我得到一个表检查没有列名为里程表:,同时编译:INSERT INTO检查(codriver,里程表,驱动程序,日期时间,vehicle_id,状态,vehicle_type)VALUES(?,?,?,?,?,?,? ); logcat中的错误。我检查了我的数据库适配器,代码工作正常,但由于某种原因,它无法识别我添加的新列。 这是db
中的代码@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);
}
这是主db
的代码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在73ms内释放了4480个对象/ 261760个字节 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在84ms内释放了8584个对象/ 420616个字节 03-28 12:53:28.715:E /数据库(331):插入codriver = odometer = 4321 driver = jim datetime = 1332964380 vehicle_id = ET 432 status = 1 vehicle_type = truck 03-28 12:53:28.715:E / Database(331):android.database.sqlite.SQLiteException:表检查没有名为odometer的列:编译时:INSERT INTO检查(codriver,里程表,驱动程序,日期时间,vehicle_id, status,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):在android.database.sqlite.SQLiteCompiledSql.compile(SQLiteCompiledSql.java:91) 03-28 12:53:28.715:E / Database(331):在android.database.sqlite.SQLiteCompiledSql。(SQLiteCompiledSql.java:64) 03-28 12:53:28.715:E / Database(331):在android.database.sqlite.SQLiteProgram。(SQLiteProgram.java:80) 03-28 12:53:28.715:E / Database(331):在android.database.sqlite.SQLiteStatement。(SQLiteStatement.java:36) 03-28 12:53:28.715:E / Database(331):在android.database.sqlite.SQLiteDatabase.compileStatement(SQLiteDatabase.java:1145) 03-28 12:53:28.715:E / Database(331):在android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1536) 03-28 12:53:28.715:E / Database(331):在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):在android.view.View $ 1.onClick(View.java:2067) 03-28 12:53:28.715:E / Database(331):在android.view.View.performClick(View.java:2408) 03-28 12:53:28.715:E / Database(331):在android.view.View $ PerformClick.run(View.java:8816) 03-28 12:53:28.715:E / Database(331):在android.os.Handler.handleCallback(Handler.java:587) 03-28 12:53:28.715:E / Database(331):在android.os.Handler.dispatchMessage(Handler.java:92) 03-28 12:53:28.715:E / Database(331):在android.os.Looper.loop(Looper.java:123) 03-28 12:53:28.715:E / Database(331):在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.run(ZygoteInit.java:868) 03-28 12:53:28.715:E / Database(331):at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 03-28 12:53:28.715:E / Database(331):at dalvik.system.NativeStart.main(Native Method)
答案 0 :(得分:2)
SQLiteOpenHelper
正在查看您现有的数据库,因此未调用onCreate
。
您需要卸载应用程序,以便摆脱现有数据库。
如果您处于开发模式,只需将DATABASE_NAME
更改为db2即可快速入侵,但请记住在数据库稳定后再将其更改回来。
如果您想以最恰当的方式执行此操作,可以增加DATABASE_VERSION
,然后在ALTER TABLE
中实现一些onUpgrade
语句。
答案 1 :(得分:0)
首次打开数据库时,onCreate
的{{1}}方法会调用,之后就会调用。
升级数据库版本时将调用SQLiteOpenHelper
方法。
因此,假设您使用Sqlite版本1.0创建数据库,然后更新数据库,您必须更改数据库版本大于当前版本的数据库。在您的情况下,您必须更改onUpgrade
变量值为2。
注意: - 强>
如果您更改数据库版本,那么它将调用DATABASE_VERSION
方法,以便它将执行此方法中的所有代码,因此如果您放入所有代码,则必须只为那些要更新的表放置那些查询表更新查询然后它将更新数据库的所有表,因此您可能丢失了旧数据库中的所有先前数据。
答案 2 :(得分:0)
我认为处理此问题的最简单方法如下:
对表格进行任何更改
将数据库版本增加1
将表格完全放在onUpgrade()
通过调用onUpgrade()
方法在onCreate()
内重新创建表格/整个数据库。
运行您的应用,并且应成功反映对数据库或表格的更改。
以下是代码示例:
@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);
}