SQLiteDatabase并发方便更新,查询未更新android

时间:2015-07-24 10:55:26

标签: java android sqlite

我正在尝试使用db。SQLiteDatabase方法更新update(...)中的条目字段,但似乎未存储该值。我已经在执行更新方法之后尝试了方便db。query(...)方法,并发现该条目仍然存储在update之前。

在查询之前我必须等待某种背景工作,或者我哪里出错?我按照SQLite DB accessed from multiple threads中的建议使用单例扩展SQLiteOpenHelperdbHelper),我甚至尝试在新线程中从帮助程序获取数据库的新可读实例,如下面的代码所示:

        ContentValues deviceListEntry = new ContentValues();
        deviceListEntry.put(DeviceListDBEntry.NODE_ID, nodeID);
...

...

        String WHERE = DeviceListDBEntry.NODE_ID + " = ?";
        final String[] WHERE_ARG = {String.valueOf(nodeID)};
        SQLiteDatabase db = dbHelper.getWritableDatabase();

        int listings = 0;
        try {
            //Update the device in the database DeviceList table
            listings = db.update(
                    DeviceListDBEntry.TABLE_NAME,
                    deviceListEntry,
                    WHERE,
                    WHERE_ARG
            );
        } catch (Exception e) {
            throw new ApiHandlerException("db.update(DeviceList, node " + nodeID + ")", e);
        }
        Log.e("updateDBdevice", " node " + device.getNodeID() + " listening = " + device.isListening());


        final String[] TABLE_COLUMNS = {
                DeviceListDBEntry.DEVICE_TYPE,
                DeviceListDBEntry.INTERVIEWED,
                DeviceListDBEntry.DEVICE_JSON
        };

        final String where = WHERE;
        new Thread(new Runnable() {
            @Override
            public void run() {
                SQLiteDatabase db2 = dbHelper.getReadableDatabase();

                Cursor deviceEntry = db2.query(
                        DeviceListDBEntry.TABLE_NAME,   //FROM      DeviceList  Table
                        TABLE_COLUMNS,                  //SELECT    *           columns
                        where,                          //WHERE     nodeID =
                        WHERE_ARG,                      //args      nodeID
                        null,
                        null,
                        null
                );

                if (!deviceEntry.moveToFirst()) throw new ApiHandlerException("DeviceListDB no entry found - WHERE nodeID = " + nodeID);
                if (deviceEntry.getCount() > 1) throw new ApiHandlerException("DeviceListDB duplicate entries - WHERE nodeID = " + nodeID);

                String deviceJson = deviceEntry.getString(deviceEntry.getColumnIndexOrThrow(DeviceListDBEntry.DEVICE_JSON));

                Log.e("updateDBdevice retreive", " node " + nodeID + " JSON : " + deviceJson);
            }
        }).start();

我正在使用Gson对象将我的device类解析为存储在DB中的JSON对象。我知道这在使用db。insert(...)方法时有效。

这里的查询仅用于查看更新是否成功,因为我发现使用其他延迟线程(使用对象锁同步并且SQLiteOpenHelper同步)的显式查询返回未更新的值。 / p>

我是否遗漏了一件显而易见的事情,或者我是否应该考虑在db上使用原始SQL命令?

2 个答案:

答案 0 :(得分:0)

我的错误,我发现我实际上没有将更新的JSON对象添加到新条目中。随后,列表中的deviceJson列未更新,但已执行db。update() ...

答案 1 :(得分:-1)

如果“WHERE”子句具有“text”列比较,则在值周围使用单引号。在你的情况下尝试下面的行(注意单引号?)

String WHERE = DeviceListDBEntry.NODE_ID + " = '?'";