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

Java SQLiteDatabase并发方便更新,查询未更新android,java,android,sqlite,Java,Android,Sqlite,我试图使用db.update(…)方法更新SQLiteDatabase中某个条目的字段,但似乎没有存储该值。我在update方法执行后立即尝试了便利db.query(…)方法,发现条目仍像更新之前一样存储 在查询之前,我是否必须等待一些背景工作,或者我哪里出了问题?我正在使用中推荐的单例扩展的SQLiteOpenHelper(dbHelper),我甚至尝试从helper中获取一个新的可读db实例,用于新线程中的查询,如下代码所示: ContentValues deviceList

我试图使用db.
update(…)
方法更新
SQLiteDatabase
中某个条目的字段,但似乎没有存储该值。我在update方法执行后立即尝试了便利db.
query(…)
方法,发现条目仍像
更新之前一样存储

在查询之前,我是否必须等待一些背景工作,或者我哪里出了问题?我正在使用中推荐的单例扩展的
SQLiteOpenHelper
dbHelper
),我甚至尝试从helper中获取一个新的可读db实例,用于新线程中的查询,如下代码所示:

        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对象将我的
设备
类解析为一个
JSON
对象,该对象存储在数据库中。我知道这在使用db.
insert(…)
方法时有效

这里的查询只是为了查看更新是否成功,因为我发现使用其他延迟线程(使用对象锁和相同的
SQLiteOpenHelper
进行同步)的显式查询返回了未更新的值

在DB?< /P> > P>中,是否有明显的东西丢失了,或者我应该考虑去做原始SQL命令,如果“WHE”子句有“文本”列比较,那么使用单引号环绕值。在你的情况下,试着在下面的一行(注意单引号吗?)


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

在执行
update(…)
方法后,是否检查了
listings
的值,以查看是否有任何行受到影响?可能您的
WHERE
子句与任何行都不匹配。@Titus我可以确认
listings
在执行
db.update()
命令后等于1。奇怪的是,更新和查询时使用了相同的
WHERE
WHERE_ARG
参数……可能会将列名放入常量中。还有,你在非常量变量上使用了所有的大写字母,这让我很困惑。正如这里提到的,android.content.ContentValues,java.lang.String,java.lang.String[])这些值被绑定为
String
s,我认为不需要引号也不需要在where子句中添加单引号。
String WHERE = DeviceListDBEntry.NODE_ID + " = '?'";