SQLite的android系统中无法识别新列加我 [英] sqlite in android not recognizing new column I added
问题描述
我在我的应用程序数据库工作得很好,然后我加里程表的分贝。现在,我得到一个表检查已经没有列命名里程表:,在编译:INSERT INTO检查(codriver,里程表,驱动程序,日期时间,vehicle_id,状态,汽车类型)VALUES(?,,,,,,?????? );错误logcat中。我检查我的数据库适配器和code工作正常,但由于某些原因,它是不承认我添加新的列。
这里是code从DB
My db in my app worked fine, then I added odometer to the db. Now I am getting a table inspections has no column named odometer: , while compiling: INSERT INTO inspections(codriver, odometer, driver, datetime, vehicle_id, status, vehicle_type) VALUES(?, ?, ?, ?, ?, ?, ?); error in logcat. I checked my db adapter and the code is working properly, but for some reason it is not recognizing the new column I added. Here is the code from the 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);
}
这里是code为主要分贝
here is the code for the main 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);
}
}
我可以包括多个code,但pretty确保误差在code以上。
I can include more code, but pretty sure the error is in the code above
更新:
卸载模拟器上的应用程序,仍然得到同样的错误。这里是logcat的
12月3日至28日:52:59.135:D / dalvikvm(331):GC_EXTERNAL_ALLOC释放885对象/在78ms 63248字节
12月3日至28日:53:05.695:D / dalvikvm(331):GC_FOR_MALLOC释放4480对象/在73ms 261760字节
12月3日至28日:53:17.065:W / KeyCharacterMap(331):无键盘ID 0
12月3日至28日:53:17.065:W / KeyCharacterMap(331):使用默认的键盘对应:/system/usr/keychars/qwerty.kcm.bin
12月3日至28日:53:28.615:I /数据库(331):sqlite的返回:错误code = 1,味精=表检查有没有指定的列里程表
12月3日至28日:53:28.715:D / dalvikvm(331):GC_FOR_MALLOC释放8584对象/在84ms 420616字节
12月3日至28日:53:28.715:E /数据库(331):错误插入codriver =里程表= 4321 =驾驶员吉姆的datetime = 1332964380 vehicle_id = ET 432状态= 1 =汽车类型卡车
12月3日至28日:53:28.715:E /数据库(331):android.database.sqlite.SQLiteException:表检查有没有名为里程表列:,在编译:INSERT INTO检查(codriver,里程表,驱动程序,日期时间,vehicle_id,状态,汽车类型)VALUES(?,,,,,,)??????;
12月3日至28日:53:28.715:E /数据库(331):在android.database.sqlite.SQLiteCompiledSql.native_compile(本机方法)
12月3日至28日:53:28.715:E /数据库(331):在android.database.sqlite.SQLiteCompiledSql.compile(SQLiteCompiledSql.java:91)
12月3日至28日:53:28.715:E /数据库(331):在android.database.sqlite.SQLiteCompiledSql(SQLiteCompiledSql.java:64)。
12月3日至28日:53:28.715:E /数据库(331):在android.database.sqlite.SQLiteProgram(SQLiteProgram.java:80)。
12月3日至28日:53:28.715:E /数据库(331):在android.database.sqlite.SQLiteStatement(SQLiteStatement.java:36)。
12月3日至28日:53:28.715:E /数据库(331):在android.database.sqlite.SQLiteDatabase.compileStatement(SQLiteDatabase.java:1145)
12月3日至28日:53:28.715:E /数据库(331):在android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1536)
12月3日至28日:53:28.715:E /数据库(331):在android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1410)
12月3日至28日:53:28.715:E /数据库(331):在com.signalsetapp.database.InspectionDBAdapter.insertInspection(InspectionDBAdapter.java:54)
12月3日至28日:53:28.715:E /数据库(331):在com.signalsetapp.report.save(report.java:120)
12月3日至28日:53:28.715:E /数据库(331):在java.lang.reflect.Method.invokeNative(本机方法)
12月3日至28日:53:28.715:E /数据库(331):在java.lang.reflect.Method.invoke(Method.java:521)
12月3日至28日:53:28.715:E /数据库(331):在android.view.View $ 1.onClick(View.java:2067)
12月3日至28日:53:28.715:E /数据库(331):在android.view.View.performClick(View.java:2408)
12月3日至28日:53:28.715:E /数据库(331):在android.view.View $ PerformClick.run(View.java:8816)
12月3日至28日:53:28.715:E /数据库(331):在android.os.Handler.handleCallback(Handler.java:587)
12月3日至28日:53:28.715:E /数据库(331):在android.os.Handler.dispatchMessage(Handler.java:92)
12月3日至28日:53:28.715:E /数据库(331):在android.os.Looper.loop(Looper.java:123)
12月3日至28日:53:28.715:E /数据库(331):在android.app.ActivityThread.main(ActivityThread.java:4627)
12月3日至28日:53:28.715:E /数据库(331):在java.lang.reflect.Method.invokeNative(本机方法)
12月3日至28日:53:28.715:E /数据库(331):在java.lang.reflect.Method.invoke(Method.java:521)
12月3日至28日:53:28.715:E /数据库(331):在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:868)
12月3日至28日:53:28.715:E /数据库(331):在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
12月3日至28日:53:28.715:E /数据库(331):在dalvik.system.NativeStart.main(本机方法)
update: uninstalled the app on the emulator, still getting the same error. Here is the logcat 03-28 12:52:59.135: D/dalvikvm(331): GC_EXTERNAL_ALLOC freed 885 objects / 63248 bytes in 78ms 03-28 12:53:05.695: D/dalvikvm(331): GC_FOR_MALLOC freed 4480 objects / 261760 bytes in 73ms 03-28 12:53:17.065: W/KeyCharacterMap(331): No keyboard for id 0 03-28 12:53:17.065: W/KeyCharacterMap(331): Using default keymap: /system/usr/keychars/qwerty.kcm.bin 03-28 12:53:28.615: I/Database(331): sqlite returned: error code = 1, msg = table inspections has no column named odometer 03-28 12:53:28.715: D/dalvikvm(331): GC_FOR_MALLOC freed 8584 objects / 420616 bytes in 84ms 03-28 12:53:28.715: E/Database(331): Error inserting 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: table inspections has no column named odometer: , while compiling: INSERT INTO inspections(codriver, odometer, driver, datetime, 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): 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.database.sqlite.SQLiteStatement.(SQLiteStatement.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/Database(331): at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1536) 03-28 12:53:28.715: E/Database(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): at android.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/Database(331): at 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.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)
推荐答案
SQLiteOpenHelper
是看到现有的数据库,因此他并没有叫的onCreate
。
SQLiteOpenHelper
is seeing your existing database and so it isn't calling onCreate
.
您需要卸载您的应用程序,让你摆脱现有的数据库中。
You need to uninstall your app so that you get rid of the existing database.
如果您在开发模式的时候,你可以只修改 DATABASE_NAME
到DB2作为一个快速黑客把自己弄去,不过记得后来改回你一次数据库是稳定的。
If you're in dev mode, you can just change the DATABASE_NAME
to db2 as a quick hack to get yourself going, but remember to change it back later once your database is stable.
如果你想要做的最正确的方式,你可以增加 DATABASE_VERSION
,然后实现一些 ALTER TABLE
在 onUpgrade
语句。
If you want to do it in the most proper way, you can increment DATABASE_VERSION
, then implement some ALTER TABLE
statements in onUpgrade
.
这篇关于SQLite的android系统中无法识别新列加我的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!