我正在尝试使用db。SQLiteDatabase
方法更新update(...)
中的条目字段,但似乎未存储该值。我已经在执行更新方法之后尝试了方便db。query(...)
方法,并发现该条目仍然存储在update
之前。
在查询之前我必须等待某种背景工作,或者我哪里出错?我按照SQLite DB accessed from multiple threads中的建议使用单例扩展SQLiteOpenHelper
(dbHelper
),我甚至尝试在新线程中从帮助程序获取数据库的新可读实例,如下面的代码所示:
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命令?
答案 0 :(得分:0)
我的错误,我发现我实际上没有将更新的JSON
对象添加到新条目中。随后,列表中的deviceJson
列未更新,但已执行db。update()
...
答案 1 :(得分:-1)
如果“WHERE”子句具有“text”列比较,则在值周围使用单引号。在你的情况下尝试下面的行(注意单引号?)
String WHERE = DeviceListDBEntry.NODE_ID + " = '?'";