前言:
Realm 是一个专门针对移动平台设计的数据库,具有:1、简单易用;2、跨平台;3、高性能;4、提供高级功能等优点。Realm在设计之初为了彻底解决性能问题,核心数据引擎用c++打造,并不是建立在SQLite上的ORM,因此性能就比普通的ORM快很多,甚至比单独无封装的SQLite还要快。
下面我们通过一个本地数据库存储的实例来一步步学习Realm的使用规则。
一、环境
1、Realm最低支持react-native 0.20.0版本,如果我们本地的rn版本低于0.20.0,需要先更新rn至最新版本。升级RN
2、因为后面关联realm原生项目,我们需要用到rnpm(react native package manager)命令,所以要确认rnpm是全局安装并且已经更新到最新版本,全局安装命令:npm install -g rnpm。
二、Realm安装
1、切换到项目目录下,运行:npm install –save realm。
2、关联realm,运行:rnpm link realm。注意:运行命令关联realm,可能会出现context找不到的错误,所以我们还要手动检查一下:
2.1:检查android->setting.gradle文件里是否有添加
include ':realm'
project(':realm').projectDir = new File(rootProject.projectDir, '../node_modules/realm/android')
没有手动添加。
2.2:检查android->app->build.gradle文件里dependences下是否有
compile project(':realm')
没有手动添加。
2.3:检查android->app->src->main->java->MainApplication文件getPackages()方法里是否有
new RealmReactPackage()
没有手动添加,且在头部引入RealReactPackage类。
import io.realm.react.RealmReactPackage;
到此时我们已经成功安装Realm并关联到我们的项目中,接下来我们就可以使用Realm的api来完成一系列数据存储操作了。
三、使用
首先我们要引入Realm模块
const Realm=require('realm');//引入Realm模块
1、定义表结构
Realm数据表结构通常在Realm初始化时传入模型schema信息(代表一个数据表结构对象)。schema对象通常由一个name(表名字),properties(一组表字段)组成。每一个表字段都必须有一个字段名,字段类型。我们还可以指定字段是否必须指定值,字段默认值,是否可被索引等。
const RecentMessageSchema={//定义RecentMessge表结构
name:'RecentMessage',//表名称
primaryKey:'id',//主键
properties:{//表字段
id:{type:'int',indexed:true,},//消息唯一标识符 indexed表示此属性可以被索引,支持int,string,bool类型值
avatar:{type:'int',optional:true},//消息发送者头像 optional表示此属性是可选属性,属性值可以为null或undefined。
userName:'string',//消息发送者姓名
userTag:{type:'string',defaultValue:'上海世途信息科技有限公司'},//消息发送者标签 defaultValue定义属性默认值
isVertify:{type:'bool',defaultValue:false},//消息发送者是否认证
time:'int',//消息发送时间
content:'string',//消息内容
}
};
Realm支持以下字段属性类型:bool,int,float,double,string,data和date。
根据表结构创建一个Realm对象:
var realm=new Realm({schema:[RecentMessageSchema]});//创建一个Realm对象
之后我们就可以利用Realm对象,进行增删改查等操作了。
2、往数据表中增加数据:
//增加操作
_addRealm(){
for(var i=0;i<10;i++){//连续增加10条数据
realm.write(()=>{
let item=realm.create('RecentMessage',{//在RecentMessage表中插入一条数据
id:i,
avatar:require('../../res/zz.jpg'),
userName:'宇智波佐助',
userTag:'万花筒血轮眼',
isVertify:true,
time:new Date().getTime(),
content:'我要摧毁木叶!!!'
},true);
console.log(item)
});
}
}
3、更改数据表中的数据
//更改操作
_updataRealm(){
for(var i=0;i<10;i++){
if(i%2==1){//更改所有id值为奇数的数据
realm.write(()=>{
realm.create('RecentMessage',{
id:i,
avatar:require('../../res/mr.jpg'),
userName:'漩涡鸣人',
userTag:'九尾人柱力',
isVertify:true,
content:'我要成为火影!!!'
},true)//true 当有相同主键的项时则更新之前数据,而不是新建一条
});
}
}
}
4、查找操作
//查询操作
_queryRealm(){
let messages=realm.objects("RecentMessage");//查询出RecentMessage表中所有记录
let zz=messages.filtered('userName CONTAINS "宇智波佐助"');//过滤出佐助的所有消息记录
let mr=messages.filtered("userName CONTAINS '漩涡鸣人'");//过滤出漩涡名人的所有消息记录
let sortZz=zz.sorted('time');//根据time对查询出的佐助记录进行排序
let sortMr=mr.sorted('time');//根据tiem对查询出的鸣人记录进行排序
console.log('排序后的佐助记录:');
console.log(sortZz);
console.log("排序后的鸣人记录:");
console.log(sortMr);
}
如果我们想要获取固定数目的结果集,则可以利用数组的slice方法进行剪切:
let messages=realm.objects("RecentMessage");//查询出RecentMessage表中所有记录
let firstFiveMessages=messages.slice(0,5);//返回前5条数据记录
5、删除操作
//删除操作
_deleteRealm(rowId){
realm.write(()=>{
let message=realm.objects('RecentMessage').filtered('id=='+rowId);//过滤出RecentMessage表中id值为7的记录
realm.delete(message);//删除
});
}
Realm中除了查询操作,增加,删除,修改都需要放到write事务中,但write事务比较耗时,所以我们应该尽量减少write事务来提高运行效率。
项目地址