0

コレクションを提供する接続リスナーがあります。これらの文字列のセットをデータベースに挿入し、DBに既に存在するかどうかを確認してから挿入する必要があります。このリスナーは、ほとんどの場合、ネットワーク接続がオフ状態からオンになるときに呼び出されます。ネットワークが不安定なため、このメソッドが頻繁に呼び出されます。このとき、WHERE 条件を配置したカーソル データは常に失敗し、カーソルのカウントは 0 を返します。カーソル/データベースが閉じられているかどうかを確認しましたが、例外はスローされていません。ブロック スレッドでも試してみましたが、カーソルの 3 回目または 4 回目の呼び出しでガベージが取得されます。

実際、私は asmack API を使用して XMPP アカウントでログインし、名簿を取得しています。名簿の場合、ネットワーク接続のオン/オフ状況の entryUpdate() メソッドが呼び出されている間に、presenceChanged()、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;
}

よろしくお願いします、アパルナ

4

2 に答える 2

0

Androidにカーソルに関する問題があることに気づいていません。コードを投稿していただけませんか?カーソルをFirstに移動するのを忘れたか、「WHERE」句に何かが欠けている可能性があります。

于 2012-08-03T06:01:29.243 に答える
0
try {
     for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {

     }
}

このようにカーソルを使用してインクリメントしてみてください。

于 2012-08-03T05:55:47.573 に答える