React native 数据库 Realm的简单使用

邵鸿福
2023-12-01

由于之前是做android 原生开发的,最近在学习混合开发,项目中也是用的react native 开发技术,在存储数据时简单点的比如说,用户的登录信息等,都可以存储在 AsyncStorage 中,这个的存储方式为key-value的形式,类似于android 中的SharedPreferences。 后面在存储银行卡信息时,用这个就不是很方便了,就想到了用数据库来存储。
最后就使用了react native 支持的 Realm 来进行数据存储。

关于Realm,网上有好多相关的文章,但都是大同小异,按照他们的方法,数据查询和数据删除在我这都不好使,最后自己慢慢摸索,总算搞出来了,这里就简单记一下

Realm 的安装

npm install --save realm   或者 yarn add realm 
react-native link realm

如果android没有link 上,自己手动添加也是可以的,这样:

在 setting.gradle文件中添加
include ':realm'
project(':realm').projectDir = new File(rootProject.projectDir, '../node_modules/realm/android')

在app下的build.gradle中添加:
compile project(':realm')

然后看MainApplication文件getPackages()方法里是否有 
new RealmReactPackage(), 
如果没有,自己添加

Realm的 使用

数据库的使用无非就是 增删改查而已,我们就从增删改查说起

realm 数据库添加数据
 const BankInfoSchema={
            name:'BankInfoData',
            primaryKey:'id',
            properties:{
                id:'string', //卡号
                cardName:'string',   // 银行名称
                cardNumLast:'string',// 银行卡后四位
                cardMoney:'string',  // 额度
                cardRepayDay:'string',// 还款日
                cardBillDay:'string', // 账单日
            }
        };

 let mRealm = new Realm({schema:[BankInfoSchema]});

  mRealm.write(()=>{
          mRealm.create('BankInfoData'{id:cardNum,cardName:this.props.bankName,cardNumLast:cardNo,
                cardMoney:'',cardRepayDay:'',cardBillDay:''});
            console.log("数据添加完成");
        });

数据添加很简单的,在write 事物中create 就可以了。

realm 数据库更新

数据库更新比较简单,和添加差不多,只是别忘了 后面的true哦!

mRealm.write(()=>{
      //进行更新
       mRealm.create('BankInfoData',{id:this.props.cardNum,cardMoney:this.state.money,  cardRepayDay: this.state.repaymentday, cardBillDay:this.state.billday},true);
            })
realm 数据库查询

关于数据库查询就比较坑了,也可能是我比较笨吧, 好多文档只写了查新全部,或者按照 id 查询,而我却是想要像android一样,将数据添加到一个集合或者数组中,用 listview 显示出来,当然这里是Flatlist

其中网上大多搜到都是这样的

 _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);

后来先查询出全部,然后再像android 中 for 循环 试着找出每个对应的值,再加的数组中,没想到还可以,见代码

let bankInfo =mRealm.objects('BankInfoData');
        let data = [];

        for (let i = 0; i <  Array.from(bankInfo).length; i++) {
            console.log("Info: " + bankInfo.length + bankInfo[i].id);
            data.push({
                            key: {
                                'cardNum': bankInfo[i].id,
                                'cardName': bankInfo[i].cardName,
                                'cardNumLast': bankInfo[i].cardNumLast,
                                'cardMoney': bankInfo[i].cardMoney,
                                'cardRepayDay': bankInfo[i].cardRepayDay,
                                'cardBillDay': bankInfo[i].cardBillDay,
                            }
                        });
        }
        this.setState({
            bankCardInfoList: data,
        })

其中的bankCardInfoList 是所有银行卡的数组集合, 也是FlatList 中的 date 数据源

这样查询的问题就解决了,具体怎么查,需要那种方式,看具体需求吧,Realm还是比较灵活好用的。

realm 数据库删除

在数据库删除这一块,也遇到了坑,之前的使用的方法是这样的,结果老报错,删不掉

 realm.write(()=>{
            let message=realm.objects('RecentMessage').filtered('id=='+rowId);//过滤出RecentMessage表中id值为7的记录
            realm.delete(message);//删除
        });

后来自己到官方文档中试了下他们提供的方法, 上面这种,删除id 为 1的数据, 可是删除不掉。

realm.write(() => {
  // Create a book object
  let book = realm.create('Book', {id: 1, title: 'Recipes', price: 35});
  // Delete the book
  realm.delete(book);

  // Delete multiple books by passing in a `Results`, `List`,
  // or JavaScript `Array`
  let allBooks = realm.objects('Book');
  realm.delete(allBooks); // Deletes all books
});

最后经过本人的摸索,终于让我给摸索出来了

mRealm.write(()=>{ 
let bankinfo =mRealm.create('BankInfoData',{id:bankCardNum,cardName:bankCardName,cardNumLast:bankCardLast,
                cardMoney:bankCardMoney,cardRepayDay:bankCardReplay,cardBillDay:bankCardBilly}, true);

            mRealm.delete(bankinfo);
        });

看出来有什么不一样的了没, 后面少了个true啊, 这官方文档也满是坑么,总算按时交差了, 对react native 数据库的应用还是皮毛,后续还需要多加研究一下。哪里有不对的地方,还往批评指正,共同学习。

最后附上官方文档连接地址:https://realm.io/docs/javascript/latest/#filtering 大家可以看看。

 类似资料: