成功交易后 SQLite 不记录值
SQLite not recording values after successful transaction
我在使用自动增量在 table 中插入记录时遇到了这种奇怪的情况。
这里是 table:
String CREATE_TABLE_ROUTES = "CREATE TABLE " + TABLE_ROUTES +
"(" +
PK_ROUTE_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
FK_ROUTE_TRACK_ID + " INTEGER," +
COL_ROUTE_ORDER + " INTEGER(11)," +
COL_ROUTE_LAT + " FLOAT," +
COL_ROUTE_LONG + " FLOAT," +
COL_ROUTE_TIME + " FLOAT," +
COL_ROUTE_SPEED + " FLOAT," +
COL_ROUTE_TIME_MS + " INTEGER(3)" +
")";
我的插入方法不起作用:
public void updateRoute(LatLongTime latLongTime, long track_id) {
long route_id = -2;
SQLiteDatabase db = getWritableDatabase();
db.beginTransaction();
try {
ContentValues values = new ContentValues();
values.put(FK_ROUTE_TRACK_ID, track_id);
values.put(COL_ROUTE_ORDER, getLastOrderForTrack(track_id) + 1);
values.put(COL_ROUTE_LAT, latLongTime.getLatitude());
values.put(COL_ROUTE_LONG, latLongTime.getLongitude());
values.put(COL_ROUTE_SPEED, latLongTime.getSpeed());
values.put(COL_ROUTE_TIME, latLongTime.getInstante());
route_id = db.insert(TABLE_ROUTES, null, values);
db.setTransactionSuccessful();
} catch (Exception e) {
Log.e(TAG, "ERROR Recording: " + e.getMessage());
} finally {
Log.d(TAG, "Route inserted: " + route_id + " track id: " + track_id);
db.endTransaction();
db.close();
}
}
调试中得到了一个成功的事务,但是再次调用这个方法后,insert方法生成了同样的route_id。
代码运行后没有任何记录(无一例外)。
这是我在调试时多次调用此函数时得到的结果:
D/Database: Route inserted: 9362 track: 103
D/Database: Route inserted: 9362 track: 103
D/Database: Route inserted: 9362 track: 103
我觉得最奇怪的是,如果我使用 ctrl+U (Android Studio) 并在单独的线程中调试它,这个函数开始正常工作并按预期增加 route_id .但仅在调试和重复此指令时:
db.beginTransaction();
try {
ContentValues values = new ContentValues();
values.put(FK_ROUTE_TRACK_ID, track_id);
values.put(COL_ROUTE_ORDER, getLastOrderForTrack(track_id) + 1);
values.put(COL_ROUTE_LAT, latLongTime.getLatitude());
values.put(COL_ROUTE_LONG, latLongTime.getLongitude());
values.put(COL_ROUTE_SPEED, latLongTime.getSpeed());
values.put(COL_ROUTE_TIME, latLongTime.getInstante());
route_id = db.insert(TABLE_ROUTES, null, values);
好吧,我明白了。
碰巧我将 SQLiteDatabase 定义为
SQLiteDatabase db = getWritableDatabase();
每个方法都使用相同的名称 (db)(我有 20 多个方法)。
将名称更改为 dbt,例如,解决了问题,现在可以正常工作了。
因为这是一个局部变量,所以应该在方法结束后使用和销毁它,但我不知道为什么,电脑出了问题。
如果有人可以对此提供一些解释,那就太好了,因为我解决了这个问题,但我只是猜测发生了什么,我不确定为什么不起作用。
我在使用自动增量在 table 中插入记录时遇到了这种奇怪的情况。
这里是 table:
String CREATE_TABLE_ROUTES = "CREATE TABLE " + TABLE_ROUTES +
"(" +
PK_ROUTE_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," +
FK_ROUTE_TRACK_ID + " INTEGER," +
COL_ROUTE_ORDER + " INTEGER(11)," +
COL_ROUTE_LAT + " FLOAT," +
COL_ROUTE_LONG + " FLOAT," +
COL_ROUTE_TIME + " FLOAT," +
COL_ROUTE_SPEED + " FLOAT," +
COL_ROUTE_TIME_MS + " INTEGER(3)" +
")";
我的插入方法不起作用:
public void updateRoute(LatLongTime latLongTime, long track_id) {
long route_id = -2;
SQLiteDatabase db = getWritableDatabase();
db.beginTransaction();
try {
ContentValues values = new ContentValues();
values.put(FK_ROUTE_TRACK_ID, track_id);
values.put(COL_ROUTE_ORDER, getLastOrderForTrack(track_id) + 1);
values.put(COL_ROUTE_LAT, latLongTime.getLatitude());
values.put(COL_ROUTE_LONG, latLongTime.getLongitude());
values.put(COL_ROUTE_SPEED, latLongTime.getSpeed());
values.put(COL_ROUTE_TIME, latLongTime.getInstante());
route_id = db.insert(TABLE_ROUTES, null, values);
db.setTransactionSuccessful();
} catch (Exception e) {
Log.e(TAG, "ERROR Recording: " + e.getMessage());
} finally {
Log.d(TAG, "Route inserted: " + route_id + " track id: " + track_id);
db.endTransaction();
db.close();
}
}
调试中得到了一个成功的事务,但是再次调用这个方法后,insert方法生成了同样的route_id。 代码运行后没有任何记录(无一例外)。
这是我在调试时多次调用此函数时得到的结果:
D/Database: Route inserted: 9362 track: 103
D/Database: Route inserted: 9362 track: 103
D/Database: Route inserted: 9362 track: 103
我觉得最奇怪的是,如果我使用 ctrl+U (Android Studio) 并在单独的线程中调试它,这个函数开始正常工作并按预期增加 route_id .但仅在调试和重复此指令时:
db.beginTransaction();
try {
ContentValues values = new ContentValues();
values.put(FK_ROUTE_TRACK_ID, track_id);
values.put(COL_ROUTE_ORDER, getLastOrderForTrack(track_id) + 1);
values.put(COL_ROUTE_LAT, latLongTime.getLatitude());
values.put(COL_ROUTE_LONG, latLongTime.getLongitude());
values.put(COL_ROUTE_SPEED, latLongTime.getSpeed());
values.put(COL_ROUTE_TIME, latLongTime.getInstante());
route_id = db.insert(TABLE_ROUTES, null, values);
好吧,我明白了。 碰巧我将 SQLiteDatabase 定义为
SQLiteDatabase db = getWritableDatabase();
每个方法都使用相同的名称 (db)(我有 20 多个方法)。
将名称更改为 dbt,例如,解决了问题,现在可以正常工作了。
因为这是一个局部变量,所以应该在方法结束后使用和销毁它,但我不知道为什么,电脑出了问题。 如果有人可以对此提供一些解释,那就太好了,因为我解决了这个问题,但我只是猜测发生了什么,我不确定为什么不起作用。