即使数据库具有正确的信息,Android游标也会返回垃圾数据

时间:2012-08-03 05:51:24

标签: android cursor

我有一个连接侦听器,它给了我Collection,我必须在数据库中插入这些字符串,并且如果不存在那么它是否已经存在于DB中,然后插入。当网络连接从OFF状态变为ON时,大多数时候会调用此监听器,由于网络不稳定,此方法被频繁调用,此时我放置WHERE条件的Cursor数据总是失败,并且光标的计数返回0。我已经检查过光标/数据库是否正在关闭,它是否会抛出任何异常。尝试阻塞线程,但仍然在第3或第4次调用游标得到垃圾,我已经解压缩.db文件并检查其条目DB数据是否完美存储在其中但仍然返回查询失败。

实际上我使用asmack API登录XMPP帐户并获取Rosters,对于Roster,我们必须设置listener,它提供presenceChanged(),entriesUpdate()等,同时网络连接开/关情况entriesUpdate()方法被调用这里我正在检查条目是否已存在于数据库中,如果没有则插入,此处光标返回垃圾值。

请告诉我造成光标损坏的原因是什么? 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;
}

谢谢你, 问候, 阿帕娜

2 个答案:

答案 0 :(得分:0)

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

     }
}

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

答案 1 :(得分:0)

不知道Android有关于Cursor的问题。 你能发一些代码吗?也许你忘记将光标移动到First,或者你的“WHERE”子句丢失了。