我正在开发一个应用程序,该应用程序从移动设备中读取联系人姓名,并检查该名称是否已保存在数据库中。如果它已经保存到数据库中,那么我只是更新一个已保存的计数器变量,但如果不是,那么我继续添加它。至少这是我的意图。
部分代码如下:
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){
中使用正确的标准,因为它要么添加所有联系人,要么它们已经保存在数据库中,或者它没有。
答案 0 :(得分: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();
这样的事情应该有效。 (我向你保证我在某个地方犯了错字,但是它的一般想法应该让你开始)。请请确保您在单独的线程上异步执行此操作...这可能是非常耗时的操作。
答案 1 :(得分:0)
使用此查询:
Cursor mCount= db.rawQuery("select count("+CONTACT_NAME+") from "+ TABLE_NAME + " where " + CONTACT_NAME + " = '" + name + "'", null);
列名之间还有一个单引号。
答案 2 :(得分:0)
您想要的查询的一个简单形式:
Cursor mCount= db.rawQuery("select count(1) from "+ TABLE_NAME +
" where " + CONTACT_NAME + " = '" + name + "'", null);