SQLite在成功交易后不记录值

时间:2016-03-22 22:58:47

标签: android sqlite insert android-sqlite

我有一个奇怪的情况,就是在一个带有自动增量的表中插入记录。

这是表格:

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 /数据库:路径插入:9362轨道:103
  D /数据库:路径插入:9362轨道:103
  D /数据库:路径插入:9362轨道:103

我觉得最奇怪的是,如果我使用ctrl + U(Android Studio)并在分离的线程中对其进行debbug,则此函数将开始正常工作并按预期增加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);

1 个答案:

答案 0 :(得分:0)

好吧,我明白了。 碰巧我正在定义SQLiteDatabase,如

SQLiteDatabase db = getWritableDatabase();

在每个方法上使用相同的名称(db)(我有超过20种方法)。

例如,将名称更改为dbt可以解决问题,现在可以解决这个问题。

由于这是一个局部变量,因此在方法结束后应该使用和销毁它,但我不知道为什么,计算机搞乱了。 如果有人可以对此提供一些解释会很好,因为我解决了问题,但我只是猜测发生了什么,我不确定原因是什么不起作用。