React Native Realm数据库存储

前言:
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。

  • bool属性映射到JavaScript中Boolean对象
  • int,float和double属性映射到JavaScript中Number对象,不过’int’和’double’会以64位进行存储但是float会以32位进行存储
  • string属性会被映射成String对象
  • data属性会被映射成ArrayBuffer对象
  • date属性会被映射成Date对象
    如果我们的字段需要引用对象,只需要把字段的类型设为引用的对象即可,但前提是必须保障被引用的对象在Realm中已存在。

根据表结构创建一个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);
    }
  • Realm当前过滤规范支持实现了NSPredicate语法的子集。对于数字类型支持基本的运算符==,!=,>=,<,和<==。对于字符类型支持==,BEGINSWITH,ENDSWITH和CONTAINS。字符串类型数据可以不分大小写通过==[c],BEGINSWITH[c]等等比较过滤。同样比较的时候可以通过获取对象的属性获取数据进行比较例如.car.color==’blue’。
  • Realm的objects,filtered,sorted操作都是返回一个Results结果集。Results结果集实例是实时更新的,该会自动更新视图到底层的数据中,这就意味着数据不需要重新抓取。

如果我们想要获取固定数目的结果集,则可以利用数组的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事务来提高运行效率。

项目地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值