我有一個連接偵聽器,它給了我集合,我必須在數據庫中插入這些字符串的集合,檢查它已經存在於數據庫或不存在如果不存在然後插入。當網絡連接從OFF狀態變爲ON時,這個監聽器被調用大部分時間,這是由於網絡的不穩定性,這個方法被頻繁地調用,此時我放置了WHERE條件的遊標數據總是失敗,並且遊標的計數返回0。我檢查過遊標/數據庫正在關閉或不關閉,它並沒有拋出任何異常。嘗試阻塞線程,但仍然在第三或第四次調用遊標獲取垃圾,我已經提取.db文件,並檢查其條目DB數據完美存儲在它,但仍然返回查詢失敗。Android遊標返回垃圾數據,即使數據庫有正確的信息
其實我使用asmack API登錄XMPP帳戶並獲得Rosters,對於名單,我們必須設置偵聽器,它給出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;
}
謝謝 問候, 阿帕娜
請發佈一些關於您的問題的代碼。這對我們來說會更容易幫助您識別問題。 – Hiral 2012-08-03 06:03:50
用代碼片段編輯我的問題,請看看。 – Aparna 2012-08-03 06:39:00