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