我有一个连接侦听器,它给了我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;
}
谢谢你, 问候, 阿帕娜
答案 0 :(得分:0)
try {
for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
}
}
尝试像这样使用和增加光标。
答案 1 :(得分:0)
不知道Android有关于Cursor的问题。 你能发一些代码吗?也许你忘记将光标移动到First,或者你的“WHERE”子句丢失了。