【问题标题】:Android cursor returns garbage data even if database is having correct information即使数据库具有正确的信息,Android 游标也会返回垃圾数据
【发布时间】:2012-08-03 14:38:22
【问题描述】:

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

实际上,我正在使用 asmack API 使用 XMPP 帐户登录并获取名册,对于名册,我们必须设置监听器,它会在网络连接开/关情况 entryUpdate() 方法被调用时提供 presentChanged()、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;
}

谢谢你, 问候, 阿帕纳

【问题讨论】:

  • 请发布一些关于您的问题的代码。这样我们可以更轻松地帮助您识别问题。
  • 用代码 sn-p 编辑了我的问题,请看一下。

标签: android cursor


【解决方案1】:
try {
     for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {

     }
}

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

【讨论】:

  • cursor.getCount() 返回 0,所以 moveToFirst 为假
【解决方案2】:

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

【讨论】:

  • 附加代码有时可以正常工作,但有时“detailCursor.getCount()”返回 0。我只能通过关闭和打开连接来重现此问题。
猜你喜欢
  • 1970-01-01
  • 2014-06-18
  • 1970-01-01
  • 1970-01-01
  • 2022-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多