Realm实战总结---Android

数据库一直以来给我的感觉就是——麻烦!!!
接触了Realm之后才终于可以开开心心的使用数据库了。
本文总结一些Realm数据库的常用知识点,包括多线程访问,以及如何与Retrofit2.0一起使用等...
看懂这些知识点之后,个人认为就可以在一般的项目中使用Realm了。

1. model类必须extends RealmObject,所有属性必须用private修饰

2. model中支持基本数据结构: boolean byte short ìnt long float double String Date and  byte[]

3.若要使用List必须用RealmList<T>,或者继承RealmList

4.与Retrofit2.*一起使用,通过Gson来解析Json数据并直接生成RealmObject,可参考如下写法:
Gson gson = new GsonBuilder()
        .setExclusionStrategies(new ExclusionStrategy() {
            @Override
            public boolean shouldSkipField(FieldAttributes f) {
                return f.getDeclaringClass().equals(RealmObject.class);
            }

            @Override
            public boolean shouldSkipClass(Class<?> clazz) {
                return false;
            }
        })
        .create();

// Configure Retrofit to use the proper GSON converter
RestAdapter restAdapter = new RestAdapter.Builder()
    .setEndpoint("https://api.github.com")
    .addConverterFactory(GsonConverterFactory.create(gson))
    .build();

GitHubService service = restAdapter.create(GitHubService.class);
5.使用@PrimaryKey 注释的成员变量,在保存时不能为null,但在执行保存的transaction之前可以是null。

6.以PrimaryKey为索引,如果要保存的数据中的primaryKey是新的则保存一条新数据,否则更新原有数据

7.建立Realm对象的方法:
Realm myOtherRealm = Realm.getInstance(new RealmConfiguration
		.Builder(this)
		.name("myOtherRealm.realm")
		.build());

8.同步查询功能示例:

public void readRealmObject(String code){
    RealmResults<User> results = myOtherRealm.where(User.class)
            .equalTo("code", code)
            .findAll();
    StringBuilder stringBuilder = new StringBuilder();
    for (User c : results) {
        stringBuilder.append(c.getCode() + " , " + c.getName() + "\n");
    }
}


9.同步写入示例:
public void saveRealmObject(User user){
    myOtherRealm.beginTransaction();
    myOtherRealm.copyToRealmOrUpdate(user);
    myOtherRealm.commitTransaction();
}


10.同步删除示例:
public void deleteRealmObject(String code){
    User searchUser = myOtherRealm.where(User.class).equalTo("code",code).findFirst();
    myOtherRealm.beginTransaction();
    searchUser.removeFromRealm();
    myOtherRealm.commitTransaction();
}



11.异步操作需实现监听接口 RealmChangeListener(),官方文档中说
This listener will be called every time the RealmResults are updated to reflect the latest changes in the Realm
即同步操作时也会调用这个接口,个人感觉比较鸡肋。

12.一个Realm只能在同一个线程中访问,在子线程中进行数据库操作必须重新获取Realm对象:
Realm realm = Realm.getInstance(new RealmConfiguration.Builder(this).name("myOtherRealm.realm").build());
并且要记得在离开线程时要关闭 realm.close();

参考链接:realm官方资料
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值