由于之前是做android 原生开发的,最近在学习混合开发,项目中也是用的react native 开发技术,在存储数据时简单点的比如说,用户的登录信息等,都可以存储在 AsyncStorage 中,这个的存储方式为key-value的形式,类似于android 中的SharedPreferences。 后面在存储银行卡信息时,用这个就不是很方便了,就想到了用数据库来存储。
最后就使用了react native 支持的 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(),
如果没有,自己添加
数据库的使用无非就是 增删改查而已,我们就从增删改查说起
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 就可以了。
数据库更新比较简单,和添加差不多,只是别忘了 后面的true哦!
mRealm.write(()=>{
//进行更新
mRealm.create('BankInfoData',{id:this.props.cardNum,cardMoney:this.state.money, cardRepayDay: this.state.repaymentday, cardBillDay:this.state.billday},true);
})
关于数据库查询就比较坑了,也可能是我比较笨吧, 好多文档只写了查新全部,或者按照 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.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 大家可以看看。