如何使用Realm在Android中读取联系人?
我找不到任何从Android读取联系人并将其保存在Realm中的解决方案。以前有人这样做过吗 我知道我将不得不使用如何使用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
联系人提供商
,但我只知道这些。好了,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。