【问题标题】:SQLite not recording values after successful transaction成功交易后 SQLite 不记录值
【发布时间】:2016-03-22 22:58:47
【问题描述】:

我遇到了一种奇怪的情况,即在具有自动增量的表中插入记录。

这是表格:

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();
        }
    }

debbuging得到了一个成功的事务,但是再次调用这个方法后,insert方法生成了相同的route_id。 代码运行后没有任何记录(无一例外)。

这是我在调试时多次调用此函数时得到的结果:

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

【问题讨论】:

    标签: android sqlite insert android-sqlite


    【解决方案1】:

    好吧,我想通了。 碰巧我将 SQLiteDatabase 定义为

    SQLiteDatabase db = getWritableDatabase();
    

    每个方法都使用相同的名称 (db)(我有 20 多个方法)。

    例如,将名称更改为 dbt,即可解决问题,并且现在可以正常工作。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-01-05
      • 1970-01-01
      • 2016-12-29
      • 2018-11-24
      • 2020-02-04
      • 1970-01-01
      • 1970-01-01
      • 2014-01-26
      相关资源
      最近更新 更多