在Android SQLite中没有添加已保存的记录时遇到问题

时间:2012-06-28 14:36:35

标签: android sqlite

我正在开发一个应用程序,该应用程序从移动设备中读取联系人姓名,并检查该名称是否已保存在数据库中。如果它已经保存到数据库中,那么我只是更新一个已保存的计数器变量,但如果不是,那么我继续添加它。至少这是我的意图。

部分代码如下:

 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){中使用正确的标准,因为它要么添加所有联系人,要么它们已经保存在数据库中,或者它没有。

3 个答案:

答案 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);