1

私は携帯電話から連絡先の名前を読み取り、その名前がす​​でにデータベースに保存されているかどうかを調べるアプリに取り組んでいます。すでにデータベースに保存されている場合は、保存されているカウンター変数を更新するだけですが、保存されていない場合は、追加を続けます。少なくともこれは私の意図です。

コードの一部は次のとおりです。

 public Integer countRecords(String name) {
       SQLiteDatabase db = events.getReadableDatabase();
       Cursor mCount= db.rawQuery("select count('"+CONTACT_NAME+"') from'"+ TABLE_NAME + "' where '" + CONTACT_NAME + "' = '" + name + "'", null); 
       mCount.moveToFirst();
       Integer count= mCount.getInt(0); 
       startManagingCursor(mCount);
       return count;
   }

コードの本体は次のようになります。

 ContentResolver cr= getContentResolver();
        Cursor cu= cr.query(URI, null, null, null, null);
            if(cu.getCount()>0){    
                while(cu.moveToNext()){
                    contactName=cu.getString(cu.getColumnIndex(DNAME));
                    Integer rawValue = countRecords(contactName);
                    if(rawValue==0){
                        addRecord(contactName);
                        addedCounter+=1;
                        recordName=cu.getString(cu.getColumnIndex(DNAME));
                        recordInfo = addedCounter + " " + recordName + "\n";    
                        recordsList+= recordInfo;
                        }
                    else{
                        savedCounter+=1;
                    }
                }

今、私は私が知っているすべてを試しました。問題は、プロシージャの戻り値にあるようcountRecordsです。おそらく、IF句if(rawValue==0){で正しい基準を使用していません。これは、すべての連絡先がデータベースにすでに保存されているか、保存されていない場合でも、すべての連絡先が追加されるためです。

4

3 に答える 3

1

あなたの現在の実装は間違っているだけでなく、信じられないほど非効率的です。代わりに次のようにしてみてください。

// use as the 2nd argument; otherwise, the cursor will return all information
// associated with the contacts. this is inefficient because you only care
// about the column DNAME in the while loop.
final String[] PROJECTION_CONTACTS = new String[] { DNAME };
final String[] PROJECTION_DATABASE = new String[] { CONTACT_NAME };

// you only need to retrieve this once (dont do it inside the loop)
SQLiteDatabase db = events.getReadableDatabase();

Cursor c = getContentResolver().query(URI, PROJECTION_CONTACTS, null, null, null);

if (c.moveToFirst()) { 
    // then the cursor is not empty

    // compute the columnIndex for "DNAME" only once
    final int col = c.getColumnIndex(DNAME);

    while(c.moveToNext()) {
        // iterate each 
        contactName = c.getString(col);
        Cursor exist = db.query(TABLE_NAME, 
                                PROJECTION_DATABASE, 
                                CONTACT_NAME + " = ?",
                                new String[] { contactName }, 
                                null);

        if (exist.moveToFirst()) {
            // the cursor is not empty, so it exists in the database
        } else {
            // the cursor is empty, so it doesn't exist in the database
        }
        exist.close();
    }
}
c.close();

このようなものがうまくいくはずです。(私はどこかでタイプミスをしたことを保証しますが、それについての一般的な考えはあなたを始めるはずです)。これを別のスレッドで非同期に行うようにしてください...非常に時間のかかる操作になる可能性があります。

于 2012-06-28T15:25:20.657 に答える
0

このクエリを使用します:

Cursor mCount= db.rawQuery("select count("+CONTACT_NAME+") from "+ TABLE_NAME + " where " + CONTACT_NAME + " = '" + name + "'", null);

列名の間に追加の一重引用符があります。

于 2012-06-28T14:53:38.537 に答える
0

目的のクエリの少し単純な形式:

Cursor mCount= db.rawQuery("select count(1) from "+ TABLE_NAME + 
" where " + CONTACT_NAME + " = '" + name + "'", null); 
于 2012-06-28T16:23:31.223 に答える