安卓数据库框架——Realm基础学习
安卓数据库框架——Realm基础学习
参考:
http://blog.5ibc.net/p/96511.html
http://www.jianshu.com/p/37af717761cc
https://realm.io/cn/docs/java/latest/#section-1
安卓数据库框架简介:
当我们的app有数据需要保存到本地缓存时,可以使用file,sharedpreferences,还有sqlite。sharedpreferences其实使用xml的方式,以键值对形式存储基本数据类型的数据。对于有复杂筛选查询的操作,file和sharedpreferences都不能满足了。
sqlite可以满足有大量复杂查询要求的缓存数据操作。但是sqlite的使用略复杂,代码量很大,还好网上有很多优秀的orm框架(Object Relational Mappin)可使用,比喻ORMlite,greenDao等。
ORMlite,greenDao这些框架都是在SQLite的基础上封装的ORM对象关系映射框架,简化了代码操作。
Realm是一个可以替代SQLite以及ORM Libraries的轻量级数据库他的核心数据引擎C++打造。相比SQLite,Realm更快并且具有很多现代数据库的特性,比如支持JSON,流式api,数据变更通知,以及加密支持,这些都为安卓开发者带来了方便。
性能对比
所以看来realm其实是完胜的,所以于情于理感觉还是准备将realm作为以后项目的数据库框架来使用。
Realm的使用
引入
第一步:
在最外层project的build.gradle中配置
dependencies{
classpath"io.realm:realm-gradle-plugin:3.1.1"
}
第二部:
在app的build.gradle中配置
apply plugin:'realm-android'
然后就可以用了。
数据模型
我们对要用realm进行存储的数据的数据需要继承RealmObject。
publicclassUserextendsRealmObject{
privateString name;
privateint age;
@Ignore
privateint sessionId;
// Standard getters & setters generated by your IDE…
publicStringgetName(){returnname;}
publicvoid setName(Stringname){this.name=name;}
publicint getAge(){returnage;}
publicvoid setAge(intage){this.age=age;}
publicint getSessionId(){returnsessionId;}
publicvoid setSessionId(intsessionId){this.sessionId=sessionId;}
}
数据的修饰符
@Required
修饰类型和空值(null),禁止数据为null,否则编译会失败。
@Ignore
意味着一个字段不应该被保存到 Realm。
@Index
为字段增加搜索索引,这会导致插入速度变慢,同时数据文件体积有所增加,
@PrimaryKey
定义字段为主键。使用 copyToRealmOrUpdate() 方法,它会用此主键尝试寻找一个已存在的对象,如果对象存在,就更新该对象;反之,它会创建一个新的对象。当 copyToRealmOrUpdate() 的调用对象没有主键时,会抛出异常。
数据之间的关系:
publicclassPersonextendsRealmObject{
privateStringid;
privateStringname;
privateRealmList<Dog>dogs;
//getters and setters
}
publicclassDogextendsRealmObject{
privateStringid;
privateStringname;
privateStringcolor;
//getters and setters
}
realm.executeTransaction(newRealm.Transaction(){
@Override
publicvoidexecute(Realmrealm){
PersonmPerson=realm.createObject(person.class);
mPerson.name="John Doe";
DogmDog1=realm.createObject(Dog.class);
mDog1.name="hehe";
mDog1.color=“red”;
mPerson.dogs.add(mDog1);
DogmDog2=realm.createObject(Dog.class);
mDog2.name="lalalla";
mDog2.color=“red”;
mPerson.dogs.add(mDog2);
}
});
这样其实产生了相互关联的两张表,person和dog。
Realm的配置
创建realm:
创建realm数据库操作对象:
RealmConfigurationmyConfig = new RealmConfiguration.Builder()
.name("myrealm.realm") // 数据库名字
.schemaVersion(2)
.modules(new MyCustomSchema())
.build();
RealmConfigurationotherConfig = new RealmConfiguration.Builder()
.name("otherrealm.realm")
.schemaVersion(5)
.modules(new MyOtherSchema())
.build();
RealmmyRealm = Realm.getInstance(myConfig);
RealmotherRealm = Realm.getInstance(otherConfig);
我们同时可以创建多个realm,他们默认存储在Context.getFilesDir()
下。
配置默认realm
Realm.setDefaultConfiguration(configuration);
这样我们就设置了默认的realm,在全局取用的时候就比较方便:
Realm.getDefaultInstance();
直接就拿到了默认的realm对象。
关闭realm对象
realm realm.close();
其他配置选项
RealmConfigurationmyConfig=newRealmConfiguration.Builder()
.name("myrealm.realm")
.inMemory()
.build();
创建一个存在于“内存中的” Realm。“内存中的”Realm 在内存紧张的情况下仍有可能使用到磁盘存储,但是这些磁盘空间都会在Realm实例完全关闭的时候被释放。
增删改查
增加
普通增加
普通增加1:
realm.beginTransaction();
Useruser=realm.createObject(User.class);// Create a new object
user.setName("John");
user.setEmail("[email protected]");
realm.commitTransaction();
普通增加2:
Useruser=newUser("John");
user.setEmail("[email protected]");
realm.beginTransaction();
UserrealmUser=realm.copyToRealm(user);
realm.commitTransaction();
当使用 realm.copyToRealm() 时,请注意只有返回的对象是由 Realm 管理的,这非常重要。对原始对象(umanaged Object)的任何改变都不会写入 Realm.
代码块增加
realm.executeTransaction(newRealm.Transaction(){
@Override
publicvoidexecute(Realmrealm){
Useruser=realm.createObject(User.class);
user.setName("John");
user.setEmail("[email protected]");
}
});
异步增加
realm.executeTransactionAsync(newRealm.Transaction(){
@Override
publicvoidexecute(RealmbgRealm){
Useruser=bgRealm.createObject(User.class);
user.setName("John");
user.setEmail("[email protected]");
}
},newRealm.Transaction.OnSuccess(){
@Override
publicvoidonSuccess(){
// Transaction was a success.
}
},newRealm.Transaction.OnError(){
@Override
publicvoidonError(Throwableerror){
// Transaction failed and was automatically canceled.
}
});
查询
查询的相关条件
相等:
equalTo()
notEqualTo()
in():在某组数值中
eg:in("name", new String[]{"Jill","William", "Trillian"})
比较:
between()
greaterThan()
lessThan()
greaterThanOrEqualTo()
lessThanOrEqualTo()
对string的比较查询:
contains()
beginsWith()
endsWith()
like()
“()”内的参数为(字段名,查询内容)
普通查询:
// Or alternatively do the same all at once (the "Fluentinterface"):
RealmResults<User>result2=realm.where(User.class)
.equalTo("name","John")
.or()
.equalTo("name","Peter")
.findAll();
关联查询:
这个是person和dog的例子
// persons => [U1,U2]
RealmResults<Person>persons=realm.where(Person.class)
.equalTo("dogs.color","Brown")
.findAll();
异步查询
RealmResults<User>result=realm.where(User.class)
.equalTo("name","John")
.or()
.equalTo("name","Peter")
.findAllAsync();
result.addChangeListener(callback); // 添加监听
删除:
普通删除:
在查询到对应的结果之后进行删除。
realm.executeTransaction(newRealm.Transaction(){
@Override
publicvoidexecute(Realmrealm){
// 删除单个匹配
results.deleteFirstFromRealm();
results.deleteLastFromRealm();
// 删除单个对象
Dogdog=results.get(5);
dog.deleteFromRealm();
// 删除所有查询到的对象
results.deleteAllFromRealm();
}
});