12.React Native数据本地存储-Realm封装
目录
1.创建Schema数据模型对象
const MoviesSchema={
name:'Movies',
primaryKey:'id',
properties:{
id:'string',
title:'string',
year:'int',
// newTitle:'string', //版本2新增字段
// testTitle:'string', //版本3新增字段
mpaa_rating:'string',
test1:'string',
test2:'string',
test3:'string',
newtest3:'string'
}
};
2.创建数据迁移模型(默认数据数组)
版本2将title和test1合并为newTitle,title和test1直接去掉即可,在migration:(oldRealm, newRealm)方法中查询旧版本数据将旧版本数据迁移到新版本的数据库中,完成版本数据库结构升级;
const MoviesSchema={
name:'Movies',
primaryKey:'id',
properties:{
id:'string',
//title:'string',
year:'int',
newTitle:'string', //版本2新增字段
// testTitle:'string', //版本3新增字段
mpaa_rating:'string',
//test1:'string',
test2:'string',
test3:'string',
newtest3:'string'
}
};
版本3将newTitle和test2合并为testTitle,newTitle和test2直接去掉即可,在migration:(oldRealm, newRealm)方法中查询旧版本数据将旧版本数据迁移到新版本的数据库中,完成版本数据库结构升级;
const MoviesSchema={
name:'Movies',
primaryKey:'id',
properties:{
id:'string',
//title:'string',
year:'int',
//newTitle:'string', //版本2新增字段
// testTitle:'string', //版本3新增字段
mpaa_rating:'string',
//test1:'string',
//test2:'string',
test3:'string',
newtest3:'string'
}
};
每个数据库版本的升级迁移模型
let UpgradeMigrations = [
{
schema:[
MoviesSchema
],
path:'movies.realm',
schemaVersion:1,
migration:(oldRealm, newRealm)=>{
}
}
,{
schema:[
MoviesSchema
],
path:'movies.realm',
schemaVersion:2,
migration:(oldRealm, newRealm)=>{
// 只有当schemaVersion小于1的时候才会执行if中代码
if(oldRealm.schemaVersion < 2){
const oldObjects = oldRealm.objects('Movies');
const newObjects = newRealm.objects('Movies');
// 遍历所有对象,并将新的模型中设置属性
for (let i = 0; i < oldObjects.length; i++) {
newObjects[i].newTitle = oldObjects[i].title + oldObjects[i].test1;
// Alert.alert('ssss', newObjects[i].newTitle);
}
}
}
},
{
schema:[
MoviesSchema
],
path:'movies.realm',
schemaVersion:3,
migration:(oldRealm, newRealm)=>{
// 只有当schemaVersion小于3的时候才会执行if中代码
if(oldRealm.schemaVersion < 3){
const oldObjects = oldRealm.objects('Movies');
const newObjects = newRealm.objects('Movies');
// 遍历所有对象,并将新的模型中设置属性
for (let i = 0; i < oldObjects.length; i++) {
newObjects[i].testTitle = oldObjects[i].newTitle+oldObjects[i].test2;
// Alert.alert('ssss', newObjects[i].testTitle);
}
}
}
}
];
3.Realm管理
//获取被给予路径的Realm的版本号
let nextSchemaIndex = Realm.schemaVersion('movies.realm');
//保证不同版本Realm升级,执行不同Realm版本迁移升级
if (nextSchemaIndex != -1) {
while (nextSchemaIndex < UpgradeMigrations.length) {
// var migratedRealm = new Realm(schemas[nextSchemaIndex++]);
// migratedRealm.close();
// const migratedRealm = new Realm({...UpgradeMigrations[nextSchemaIndex] });
const migratedRealm = new Realm(UpgradeMigrations[nextSchemaIndex++]);
// nextSchemaIndex += 1;
migratedRealm.close();
}
}
//获取当前版本的Realm
let realm = new Realm(UpgradeMigrations[UpgradeMigrations.length-1]);
4.批量数据插入处理
将批量数据放在一个事务(realm.write())中执行数据插入或更新;
//在一个事务中循环插入数据
movies.forEach(obj => {
realm.create('Movies', obj, Realm.UpdateMode.Modified);
});
const insertMovies=(movies)=>{
try{
realm.write(()=>{
movies.forEach(obj => {
realm.create('Movies', obj, Realm.UpdateMode.Modified);
});
});
}catch (error) {
console.log(error);
}
};
调用执行批量数据插入
let movies = [];
for(let i=0; i<1000; i++) {
movies[i] = {
id: i + 'a000000',
title: '展昭1234567890',
year: 1978,
mpaa_rating: 'mpaa_rating1',
test1: 'testha1',
test2: 'testha2',
test3: 'testha3'
};
}
insertMovies(movies);
导入包含50000个实体的JSON字符串大约需要10秒。(每个实体都有ID、标题和年属性)。一个技巧是调试模式比在真实应用程序上运行要慢得多。
数据查询
//查询
const queryMovies = () =>{
return realm.objects('Movies');
};
删除数据
//删除
const deleteMovies = () =>{
try {
realm.write(() => {
realm.delete(realm.objects('Movies'));
})
}
catch (error){
console.log(error)
}
}
5.完整代码示例
/**
* Realm管理类
*/
import Realm from 'realm'
import {Alert} from 'react-native';
// import {MoviesSchema} from 'public/realm/Schemeas'
// import Migrations from 'Migrations'
const MoviesSchema={
name:'Movies',
primaryKey:'id',
properties:{
id:'string',
title:'string',
year:'int',
// newTitle:'string', //版本2新增字段
// testTitle:'string', //版本3新增字段
mpaa_rating:'string',
test1:'string',
test2:'string',
test3:'string',
newtest3:'string'
}
};
let UpgradeMigrations = [
{
schema:[
MoviesSchema
],
path:'movies.realm',
schemaVersion:1,
migration:(oldRealm, newRealm)=>{
}
}
,{
schema:[
MoviesSchema
],
path:'movies.realm',
schemaVersion:2,
migration:(oldRealm, newRealm)=>{
// 只有当schemaVersion小于1的时候才会执行if中代码
if(oldRealm.schemaVersion < 2){
const oldObjects = oldRealm.objects('Movies');
const newObjects = newRealm.objects('Movies');
// 遍历所有对象,并将新的模型中设置属性
for (let i = 0; i < oldObjects.length; i++) {
newObjects[i].newTitle = oldObjects[i].title + oldObjects[i].test1;
// Alert.alert('ssss', newObjects[i].newTitle);
}
}
}
},
{
schema:[
MoviesSchema
],
path:'movies.realm',
schemaVersion:3,
migration:(oldRealm, newRealm)=>{
// 只有当schemaVersion小于3的时候才会执行if中代码
if(oldRealm.schemaVersion < 3){
const oldObjects = oldRealm.objects('Movies');
const newObjects = newRealm.objects('Movies');
// 遍历所有对象,并将新的模型中设置属性
for (let i = 0; i < oldObjects.length; i++) {
newObjects[i].testTitle = oldObjects[i].newTitle+oldObjects[i].test2;
// Alert.alert('ssss', newObjects[i].testTitle);
}
}
}
},
// {
// schema:[
// MoviesSchema
// ],
// path:'movies.realm',
// schemaVersion:4,
// migration:(oldRealm, newRealm)=>{
// // 只有当schemaVersion小于3的时候才会执行if中代码
// if(oldRealm.schemaVersion < 3){
// const oldObjects = oldRealm.objects('Movies');
// const newObjects = newRealm.objects('Movies');
//
// // 遍历所有对象,并将新的模型中设置属性
// for (let i = 0; i < oldObjects.length; i++) {
// newObjects[i].newtest3 = oldObjects[i].testTitle + oldObjects[i].mpaa_rating;
// // Alert.alert('ssss', newObjects[i].testTitle);
// }
// }
// }
// }
];
let nextSchemaIndex = Realm.schemaVersion('movies.realm');
//保证不同版本数据库升级
if (nextSchemaIndex != -1) {
while (nextSchemaIndex < UpgradeMigrations.length) {
// var migratedRealm = new Realm(schemas[nextSchemaIndex++]);
// migratedRealm.close();
// const migratedRealm = new Realm({...UpgradeMigrations[nextSchemaIndex] });
const migratedRealm = new Realm(UpgradeMigrations[nextSchemaIndex++]);
// nextSchemaIndex += 1;
migratedRealm.close();
}
}
let realm = new Realm(UpgradeMigrations[UpgradeMigrations.length-1]);
const insertMovies=(movies)=>{
try{
realm.write(()=>{
// let oldMovies = realm.objects('Movies');
// let count = oldMovies.length;
// if(oldMovies = null || count == 0){
// realm.create('Movies', movies, Realm.UpdateMode.Modified);
// }else{
// oldMovies[count - 1].id = movies.id;
// oldMovies[count - 1].title = movies.title;
// oldMovies[count - 1].year = movies.year;
// oldMovies[count - 1].mpaa_rating = movies.mpaa_rating;
// oldMovies[count - 1].test1 = movies.test1;
// oldMovies[count - 1].test2 = movies.test2;
// oldMovies[count - 1].test3 = movies.test3;
movies.forEach(obj => {
realm.create('Movies', obj, Realm.UpdateMode.Modified);
});
// }
});
}catch (error) {
console.log(error);
}
};
//查询
const queryMovies = () =>{
return realm.objects('Movies');
};
export {
insertMovies,
queryMovies
}
参考:
react-native Realm的使用
https://juejin.im/post/5a4b477b51882506e50d0175#heading-5
How to fast insert a JSON into Realm Database for a React Native App