0

我有一个连接侦听器,它给了我 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;
}

谢谢, 问候, 阿帕纳

4

2 回答 2

0
try {
     for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {

     }
}

尝试像这样使用和增加光标。

于 2012-08-03T05:55:47.573 回答
0

不知道 Android 有关于光标的问题。你能发布一些代码吗?也许您忘记将光标移动到 First,或者您的“WHERE”子句缺少某些内容。

于 2012-08-03T06:01:29.243 回答