【发布时间】:2016-09-06 15:14:48
【问题描述】:
我找不到从 Android 读取联系人并将其保存在 Realm 中的任何解决方案。以前有人做过吗?
我知道我必须使用Contacts Provider,但这就是我所知道的。 AFAIK,Realm 不支持 Cursor 所以...还有什么?
编辑:
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
}
联系人.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;
}
}
【问题讨论】:
-
读取联系人并将其存储在数据库中是两个完全独立的操作。从阅读开始,如果成功,请担心将它们存储在领域中
-
当
copyToRealmOrUpdate()的返回值被忽略时,insertOrUpdate()是一个更优化(更节省内存)的解决方案。 -
重复问题很常见,如果你在谷歌搜索duplication whatsapp stack overflow,你会找到其他答案。我认为人与人之间的电话号码必须唯一的假设有点硬核,即使我的联系人也会打破它。
-
@EpicPandaForce stackoverflow.com/questions/39371540/… :))