从内容提供商处获取联系人,无需重复或无效的联系人,并保存到Realm

时间:2016-09-07 13:41:14

标签: android realm android-contentprovider android-contacts

我有这个代码(幸好由@EpicPandaForce提供),我有删除问题。当我添加新的联系人时,它就像一个魅力,当我删除联系人(或来自该联系人的号码,如果有两个)时,它会保持在Realm中。我怎样才能让它正常工作?

realm.executeTransaction(new Realm.Transaction() {
        @Override
        public void execute(Realm realm) {
            Contact realmContact = new Contact();
            String filter = "" + ContactsContract.Contacts.HAS_PHONE_NUMBER + " > 0 and "
                    + ContactsContract.CommonDataKinds.Phone.TYPE +"="
                    + ContactsContract.CommonDataKinds.Phone.TYPE_MAIN;

            Cursor phones = getActivity()
                    .getContentResolver()
                    .query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, filter, null, null);

            while (phones.moveToNext()) {
                String id = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone._ID));
                String name = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
                String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                realmContact.setId(id);
                realmContact.setName(name);
                realmContact.setNumber(phoneNumber);
                realmContact.setIsBeingSaved(true);
                realm.insertOrUpdate(realmContact);
            }

            /** merge mechanism */
            realm.where(Contact.class)
                    .equalTo("isBeingSaved", false)
                    .findAll()
                    .deleteAllFromRealm(); // delete all non-saved data
            for(Contact contact : realm.where(Contact.class).findAll()) {
                realmContact.setIsBeingSaved(false); // reset all save state
            }

Contact.class

public class Contact extends RealmObject{

    @PrimaryKey
    private String id;

    @Index
    private String name;

    @Index
    private String number;

    @Index
    private boolean isBeingSaved;

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getNumber() {
        return number;
    }

    public void setNumber(String number) {
        this.number = number;
    }

    public boolean getIsBeingSaved() {
        return isBeingSaved;
    }

    public void setIsBeingSaved(boolean beingSaved) {
        isBeingSaved = beingSaved;
    }
}

编辑 - 工作代码:

Contact realmContact = new Contact();

            Uri uri = Contacts.CONTENT_URI;

            String selection = "((" + CommonDataKinds.Phone.DISPLAY_NAME_PRIMARY + " NOTNULL) AND ("
                    + Contacts.HAS_PHONE_NUMBER + "=1) AND ("
                    + CommonDataKinds.Phone.DISPLAY_NAME_PRIMARY + " != '' ))";

            Cursor phones = getActivity()
                    .getContentResolver()
                    .query(uri, null, selection, null, null);

            String phoneNumber = "";
            while (phones.moveToNext()) {
                String id = phones.getString(phones.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY));
                String name = phones.getString(phones.getColumnIndex(Contacts.DISPLAY_NAME_PRIMARY));
                String lastTimeContacted = phones.getString(phones.getColumnIndex(Contacts.LAST_TIME_CONTACTED));

                if(Integer.parseInt(phones.getString(phones.getColumnIndex(Contacts.HAS_PHONE_NUMBER))) > 0){
                    Cursor pCur = getActivity().getContentResolver().query(
                            CommonDataKinds.Phone.CONTENT_URI,
                            null,
                            CommonDataKinds.Phone.LOOKUP_KEY +" = ?",
                            new String[]{id}, null);

                    while (pCur.moveToNext()) {
                        phoneNumber += "/" + pCur.getString(pCur.getColumnIndex(CommonDataKinds.Phone.NUMBER));
                        realmContact.setNumber(phoneNumber);
                    }
                    phoneNumber = "";
                    pCur.close();
                } else {
                    realmContact.setNumber("1234");
                }
                realmContact.setId(id);
                realmContact.setName(lastTimeContacted);
                realmContact.setIsBeingSaved(true);
                realm.insertOrUpdate(realmContact);
            }

            Log.i("asd-size", realm.where(Contact.class).findAll().size() + "");

            /** merge mechanism */
            realm.where(Contact.class)
                    .equalTo("isBeingSaved", false)
                    .findAll()
                    .deleteAllFromRealm(); // delete all non-saved data


            for(Contact contact : realm.where(Contact.class).findAll()) {
                contact.setIsBeingSaved(false); // reset all save state
            }

1 个答案:

答案 0 :(得分:0)

好的,经过长时间的搜索,我发现有一个错字:

LoggedMessage

它的 /** merge mechanism */ realm.where(Contact.class) .equalTo("isBeingSaved", false) .findAll() .deleteAllFromRealm(); // delete all non-saved data for(Contact contact : realm.where(Contact.class).findAll()) { realmContact.setIsBeingSaved(false); <- here it is } 实际上它应该是realmContact所以它指的是contact循环迭代的联系。

所以,基本上,它将for设置为Contact realmContact = new Contact();。所以正确的版本是:

false