我有一个连接侦听器,它给了我 Collection,我必须在数据库中插入这些字符串集,并检查它是否已经存在于 DB 中,如果不存在则插入。大多数情况下,当网络连接从 OFF 状态变为 ON 时,都会调用此侦听器,由于网络不稳定,此方法被频繁调用,此时我放置 WHERE 条件的游标数据始终失败,游标计数返回 0。我检查了游标/数据库是否关闭,它没有抛出任何异常。也尝试使用阻塞线程,但仍然在第 3 次或第 4 次游标调用中得到垃圾,我提取了 .db 文件并检查其条目 DB 数据是否完美存储在其中,但仍然返回查询失败。
实际上,我正在使用 asmack API 使用 XMPP 帐户登录并获取 Rosters,对于 Roster,我们必须设置监听器,它提供 presentChanged()、entriesUpdate() 等,同时调用网络连接开/关情况 entryUpdate() 方法,我在这里检查数据库中是否已经存在条目,如果不存在则插入,这里游标返回垃圾值。
请让我知道光标损坏的原因可能是什么?Android 是否对 Cursor 有此类问题?
注意:我没有使用 ContentProvider
这是代码:
private synchronized ArrayList<Contact> updateDBForNewEntries(int connectionIndex, Hashtable<String, String> addresses){
if(connectionIndex == NONE || addresses == null || addresses.size() <= 0)
return null;
String to = getAccountUserName(connectionIndex);
if(to == null){
return null;
}
AddressBookDBAdapter dbHelper = new AddressBookDBAdapter(context);
dbHelper.open();
String contactLookupTableName, whereClause, idColumn;
if (connectionIndex == MAIN_INDEX) {
contactLookupTableName = AddressBookDBAdapter.TABLENAME_CONTACT_DETAILS;
idColumn = AddressBookDBAdapter.CONTACT_ID;
} else {
contactLookupTableName = AddressBookDBAdapter.TABLENAME_VCARD_LOOKUP;
idColumn = AddressBookDBAdapter.VCARD_ID;
}
ArrayList<Contact> addedContactsList = new ArrayList<Contact>();
Iterator<String> iterator = addresses.keySet().iterator();
to = Utils.trimStringWithSlash(to);
while (iterator.hasNext()) {
String mailId = Utils.trimStringWithSlash((iterator.next()).trim()).toLowerCase();
if(mailId == null || mailId.trim().length() <= 0)
continue;
//check TO and FROM conditions
if(to.equalsIgnoreCase(mailId)){
mailId = null;
continue;
}
Utils.debugLog("*******frm update Mail Id = " + mailId);
if (connectionIndex == MAIN_INDEX) {
contactLookupTableName = AddressBookDBAdapter.TABLENAME_CONTACT_DETAILS;
whereClause = AddressBookDBAdapter.DATA_TYPE + "='"+ CONTACT_DATATYPE.IM + "' AND "+ AddressBookDBAdapter.DATA + " = '" + mailId.toLowerCase() + "'";
SQLiteCursor detailCursor = dbHelper.query(contactLookupTableName,
new String[] { idColumn },
whereClause, null, null, null, null);
Utils.debugLog("**** detailed cursor = " + (detailCursor != null? detailCursor.getCount():null)+"; whereclause="+whereClause);
try{
if(detailCursor != null){
if (!detailCursor.isClosed() && detailCursor.moveToFirst()) {
String searchKey = detailCursor.getString(0);
Utils.debugLog("****** mail Id already exist here="+whereClause + ";"+searchKey);
//TODO: Perform update operation here
} else{
//Mail Id not exist in database so add it a a new entry
//TODO:: Perform insertion
}
}
if(detailCursor != null && !detailCursor.isClosed())
detailCursor.close();
}catch(Exception e){}
detailCursor = null;
}
mailId = null;
}
Utils.debugLog("*** While loop ends " );
dbHelper.close();
to = null;
return addedContactsList;
}
谢谢, 问候, 阿帕纳