我找不到任何解决方案来从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 }
Contact.class
public class Contact extends RealmObject{@PrimaryKeyprivate String ID;@Indexprivate String name;@Indexprivate String number;@Indexprivate 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 threadRealm 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 threadRealm 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的其他问题,以便可靠地读取联系人数据(因为有一些联系人LOOKUP_ID,并确保ID正确):Obtaining contacts from content provider without duplicates or invalid contacts, and save to Realm
总结以上是内存溢出为你收集整理的如何使用Realm阅读Android中的联系人?全部内容,希望文章能够帮你解决如何使用Realm阅读Android中的联系人?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)