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