Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Realm在Android中读取联系人?_Android_Realm - Fatal编程技术网

如何使用Realm在Android中读取联系人?

如何使用Realm在Android中读取联系人?,android,realm,Android,Realm,我找不到任何从Android读取联系人并将其保存在Realm中的解决方案。以前有人这样做过吗 我知道我将不得不使用联系人提供商,但我只知道这些。好了,Realm不支持光标那么…还有什么 编辑: 联系方式 public class Contact extends RealmObject{ @PrimaryKey private String id; @Index private String name; @Index private String number; @Index privat

我找不到任何从Android读取联系人并将其保存在Realm中的解决方案。以前有人这样做过吗

我知道我将不得不使用
联系人提供商
,但我只知道这些。好了,Realm不支持
光标
那么…还有什么

编辑:

联系方式

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;
}

}

您可以创建一个模型类来存储联系人所需的数据

然后使用游标在模型类中获取数据并设置数据

将光标数据保存在模型对象列表中


然后在单个事务中插入所有模型对象,因为对象事务有开销并减慢我们的应用程序的速度

您可以创建一个模型类来存储联系人所需的数据

然后使用游标在模型类中获取数据并设置数据

将光标数据保存在模型对象列表中


然后在单个事务中插入所有模型对象,因为对象事务有开销并减慢我们的应用程序的速度

创建RealmObject,从内容提供商读取数据,将数据保存到RealmObject,将数据保存到Realm:

// background thread
Realm realm = null;
try {
    realm = Realm.getDefaultInstance();
    realm.executeTransaction(new Realm.Transaction() {
        @Override
        public void execute(Realm realm) {
            RealmContact realmContact = new RealmContact();
            Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
            while (phones.moveToNext()) {
               String name = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
               String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
               realmContact.setName(name);
               realmContact.setPhoneNumber(phoneNumber);
               realm.insertOrUpdate(realmContact);
            }
        }
    });
} finally {
    if(realm != null) {
        realm.close();
    }
}
编辑:好的,下面是一个合并数据并删除所有不在保存列表中的数据的技巧

public class RealmContract extends RealmObject {
    @PrimaryKey
    private long id;

    @Index
    private String name;

    @Index
    private String phoneNumber;

    @Index
    private boolean isBeingSaved;

    //getters, setters
}
然后合并:

// background thread
Realm realm = null;
try {
    realm = Realm.getDefaultInstance();
    realm.executeTransaction(new Realm.Transaction() {
        @Override
        public void execute(Realm realm) {
            RealmContact realmContact = new RealmContact();
            Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
            while (phones.moveToNext()) {
               String id = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds._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.setPhoneNumber(phoneNumber);
               realmContact.setIsBeingSaved(true);
               realm.insertOrUpdate(realmContact);
            }
            realm.where(RealmContact.class)
                 .equalTo(RealmContactFields.IS_BEING_SAVED, false) // compile 'dk.ilios:realmfieldnameshelper:1.0.0'
                 .findAll()
                 .deleteAllFromRealm(); // delete all non-saved data
            for(RealmContact realmContact : realm.where(RealmContact.class).findAll()) { // realm 0.89.0+
                realmContact.setIsBeingSaved(false); // reset all save state
            }
        }
    });
} finally {
    if(realm != null) {
        realm.close();
    }
}


编辑:请参考OP的另一个问题,以可靠地读取联系人数据(因为联系人查找ID有问题,并确保ID正确):

创建RealmObject,从内容提供商读取数据,将数据保存到RealmObject,将数据保存到域中:

// background thread
Realm realm = null;
try {
    realm = Realm.getDefaultInstance();
    realm.executeTransaction(new Realm.Transaction() {
        @Override
        public void execute(Realm realm) {
            RealmContact realmContact = new RealmContact();
            Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
            while (phones.moveToNext()) {
               String name = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
               String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
               realmContact.setName(name);
               realmContact.setPhoneNumber(phoneNumber);
               realm.insertOrUpdate(realmContact);
            }
        }
    });
} finally {
    if(realm != null) {
        realm.close();
    }
}
编辑:好的,下面是一个合并数据并删除所有不在保存列表中的数据的技巧

public class RealmContract extends RealmObject {
    @PrimaryKey
    private long id;

    @Index
    private String name;

    @Index
    private String phoneNumber;

    @Index
    private boolean isBeingSaved;

    //getters, setters
}
然后合并:

// background thread
Realm realm = null;
try {
    realm = Realm.getDefaultInstance();
    realm.executeTransaction(new Realm.Transaction() {
        @Override
        public void execute(Realm realm) {
            RealmContact realmContact = new RealmContact();
            Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
            while (phones.moveToNext()) {
               String id = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds._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.setPhoneNumber(phoneNumber);
               realmContact.setIsBeingSaved(true);
               realm.insertOrUpdate(realmContact);
            }
            realm.where(RealmContact.class)
                 .equalTo(RealmContactFields.IS_BEING_SAVED, false) // compile 'dk.ilios:realmfieldnameshelper:1.0.0'
                 .findAll()
                 .deleteAllFromRealm(); // delete all non-saved data
            for(RealmContact realmContact : realm.where(RealmContact.class).findAll()) { // realm 0.89.0+
                realmContact.setIsBeingSaved(false); // reset all save state
            }
        }
    });
} finally {
    if(realm != null) {
        realm.close();
    }
}


编辑:请参考OP的另一个问题,以可靠地读取联系人数据(因为联系人查找ID有问题,并确保ID正确):

读取联系人和将其存储在数据库中是两个完全独立的操作。从读取开始,如果读取成功,请担心将它们存储在realm中。当忽略
copyToRealmOrUpdate()
的返回值时,这应该会有所帮助,然后
insertOrUpdate()
是一个更优(内存效率更高)的解决方案。复制问题非常常见,如果你在谷歌搜索重复whatsapp堆栈溢出,你会找到其他答案。我认为人们之间的电话号码必须是唯一的这一假设有点顽固,即使是我的联系人也会破坏它。@EpicPandaForce:))读取联系人和将其存储在数据库中是两个完全独立的操作。从读取开始,如果读取成功,请担心将它们存储在realm中。当忽略
copyToRealmOrUpdate()
的返回值时,这应该会有所帮助,然后
insertOrUpdate()
是一个更优(内存效率更高)的解决方案。复制问题非常常见,如果你在谷歌搜索重复whatsapp堆栈溢出,你会找到其他答案。我认为人与人之间的电话号码必须是唯一的这一假设有点顽固,即使是我的联系人也会打破它。@EpicPandaForce:))这太棒了!非常感谢。还有一个问题:如果手机上的联系人被删除,它将保留在数据库中-如何更新以反映更改?如果您还获得了Contacts contract.Contacts.\u ID并将其用作主键,那么您可以跟踪应用程序中的用户。当我进入PC时,我会用代码来回应这个问题,告诉你如何在你的写事务中轻松添加新元素和删除不存在的元素。我会做
try finally
来确保无论发生什么情况,领域都是关闭的。在背景线程上关闭领域实例是非常重要的。我认为这个问题被回答(因为注释树太长),并且我保证合并是有效的,因为我在生产和应用中使用它,但是如果你问一个新的关于删除失败的问题,我会回答一个:PITS太棒了!非常感谢。还有一个问题:如果手机上的联系人被删除,它将保留在数据库中-如何更新以反映更改?如果您还获得了Contacts contract.Contacts.\u ID并将其用作主键,那么您可以跟踪应用程序中的用户。当我进入PC时,我会用代码来回应这个问题,告诉你如何在你的写事务中轻松添加新元素和删除不存在的元素。我会做
try finally
来确保无论发生什么情况,领域都是关闭的。在背景线程上关闭领域实例是非常重要的。我认为这个问题被回答(因为注释树太长),并且我保证合并是有效的,因为我在生产和应用中使用这个,但是如果你问一个关于删除失败的新问题,我会回答一个:P。