2012-08-03 49 views
0

我有一個連接偵聽器,它給了我集合,我必須在數據庫中插入這些字符串的集合,檢查它已經存在於數據庫或不存在如果不存在然後插入。當網絡連接從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; 
} 

謝謝 問候, 阿帕娜

+0

請發佈一些關於您的問題的代碼。這對我們來說會更容易幫助您識別問題。 – Hiral 2012-08-03 06:03:50

+0

用代碼片段編輯我的問題,請看看。 – Aparna 2012-08-03 06:39:00

回答

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

    } 
} 

嘗試使用並增加光標喜歡這個。

+0

cursor.getCount()返回0,所以moveToFirst爲false – Aparna 2012-08-03 06:18:43

0

不知道Android有關於光標的問題。 你可以請張貼一些代碼嗎?也許你忘了將光標移到First,或者你的「WHERE」子句丟失了一些東西。

+0

用代碼片段編輯我的問題,請看看。 – Aparna 2012-08-03 06:38:52

+0

附加代碼有時可以正常工作,但有時「detailCursor.getCount()」返回0.我只能在連接關閉和打開的情況下重現此問題。 – Aparna 2012-08-03 06:46:26

相關問題