从联系表中删除特定行

时间:2013-09-03 07:45:15

标签: android sqlite

我正在使用一个应用程序,用户可以通过该应用程序从电话联系人中选择联系人并向他们发送消息。我正在为这样的电话联系人获取光标。

Cursor cursor =getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,null,null, null);

我在cursoradapter中使用此光标在listview中显示它, 我有一个数据库,存储用户选择的联系人。现在我只想显示listview中不在我的数据库中的联系人,我的意思是我想要select name,phonenumber from contact except select name,phonenumber from mydatabase之类的东西,并在光标中得到这个结果我将用于cursoradapter。这可能吗?我怎么能这样做,请帮助我。提前谢谢!

3 个答案:

答案 0 :(得分:0)

第四个参数是你的'WHERE'部分,所以你可以在那里添加它。

http://developer.android.com/reference/android/content/ContentResolver.html#query(android.net.Uri,java.lang.String [],java.lang.String,java.lang.String [],java.lang.String)

如果这不起作用,您可以随时循环遍历结果并以编程方式过滤掉它。

答案 1 :(得分:0)

如果您要删除任何特定联系人,则必须使用以下查询

  Cursor cr = getContentResolver().delete(url, where, selectionArgs);

或者如果想要删除所有联系人

 ContentResolver cr = getContentResolver();
Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,
        null, null, null, null);
while (cur.moveToNext()) {
    try{
        String lookupKey = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY));
        Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_LOOKUP_URI, lookupKey);
        System.out.println("The uri is " + uri.toString());
        cr.delete(uri, null, null);
    }
    catch(Exception e)
    {
        System.out.println(e.getStackTrace());
    }
}

我希望这会对你有所帮助。

答案 2 :(得分:0)

由于联系人和您的数据库不在同一个数据库中,因此您无法直接在同一查询中组合他们的数据。一些方法:

  1. 从代码中的联系人结果集中过滤不需要的行。例如。如果名称和编号与您的数据库匹配,只需将光标移动到下一行。

  2. 首先从数据库构建排除列表,并将其与联系人数据库查询一起使用,例如

    select name || ':magicseparator:' || number from mydatabase;
    

    其中:magicseparator:只是一些随机字符串,用于帮助分隔名称和数字并防止名称号码冲突。

    然后从这些结果中构造一个以逗号分隔的字符串列表,然后传递给联系人查询中的选择(WHERE)条件:

     "name || ':magicseparator:' || number not in (" + yourCommaSeparatedExclusionList + ")"