12.React Native数据本地存储-Realm封装

目录

 

1.创建Schema数据模型对象

2.创建数据迁移模型(默认数据数组)

3.Realm管理

4.批量数据插入处理

5.完整代码示例


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

https://stackoverflow.com/questions/50937202/how-to-fast-insert-a-json-into-realm-database-for-a-react-native-app