Realm-ReactNative使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/shb2058/article/details/84956373

最大的点:Realm中有主键的概念,主键不能重复,但是主键不能自增,这个自增需要自己来保证

1.导入

跟着官方走

2.使用

注:由于所有页面的增删改查都依靠一个realm对象,所以吧这个对象保存在单例的一个属性中,保证全局唯一


let instance = null;
export default class SaveUtil {
    realm;
    constructor() {
        if (!instance) {
            instance = this;
        }
        return instance;
    }

    setRealm(realm) {
        this.realm = realm;
    }

    getRealm() {
        return this.realm;
    }



    static getInstance() {
        return new SaveUtil();
    }



}

具体使用:增删改查如下

创建数据库:

参数可以为空有两种方式,第一种‘string?’:在类型后面加?;第二种optional:true表示可以为空

onst CarSchema = {
    //optional 表示是否可以为空  primaryKey表示主键,但是他不会自增,需要自己来实现不重复。主键重复就不能保存进去
    //当参数没有default值时候,option设置为true表示可以为空
//当参数有default值时,option不管设置true和false都能插入进去,因为默认值是default的值
    name: 'Car',
    primaryKey: 'id',
    properties: {
        id: {type: 'int', default: 0, optional: true},
        make: 'string',
        model: 'string',
        miles: {type: 'int', default: 0},
        newData: {type: 'string', default: 'newData', optional: false}
    }
};

const UpdateCarSchema = {
    name: 'Car',
    primaryKey: 'id',
    properties: {
        id: {type: 'int', optional: true},
        make: 'string',
        model: 'string',
        miles: {type: 'int', default: 0},
        newData: {type: 'string', default: 'newData', optional: false}
    }
};


const PersonSchema = {
    name: 'Person',
    properties: {
        name: 'string',
        birthday: 'string',
        cars: 'Car[]',
        picture: 'string?'
    }
};
 //打开、创建数据库
    openDB() {
        Realm.open({schema: [CarSchema, PersonSchema], schemaVersion: 0})
            .then(realm => {
                console.log('得到了realm对象');
                SaveUtil.getInstance().setRealm(realm);
                //打开后再获取下所有存储的数据
                this.getAllDB();
            })
            .catch(error => {
                Alert.alert('创建数据库失败:' + error)
                console.log(error);
            });
    }

增:

//新增一条数据到数据库
    addDataToDB() {
        console.log("addDataToDB");
        let cars = SaveUtil.getInstance().getRealm().objects('Car');
        try {
            SaveUtil.getInstance().getRealm().write(() => {
                SaveUtil.getInstance().getRealm().create('Car', {
                    newData: 'newData',
                    id: cars.length,
                    make: 'DXXX',
                    model: 'model',
                    miles: cars.length,
                });
                this.getAllDB();
            })

        } catch (e) {
            console.log('插入数据出错' + e);
        } finally {

        }
    }

改:

  //修改数据
    updateDB(id, model) {
        console.log("updateDB");
        //两种方式,一种是sql查询到需要操作的数据
        let car = SaveUtil.getInstance().getRealm().objects('Car').filtered('id = 0');
        console.log('找到这个id为0的是' + JSON.stringify(car));
        SaveUtil.getInstance().getRealm().write(() => {
            //必须使用write才能用
            console.log('实际操作的' + JSON.stringify(car) + '==' + model);
            car[0].model = model;
            this.getAllDB();
        });
//另一种是代码找到需要操作的数据
        // if (this.state.allDatas == null) {
        //     Alert.alert('数据库无数据!');
        //     return;
        // }
        // for (let i = 0; i < this.state.allDatas.length; i++) {
        //     if (this.state.allDatas[i].id == id) {
        //         SaveUtil.getInstance().getRealm().write(() => {
        //             //必须使用write才能用
        //             this.state.allDatas[i].model = model;
        //             this.getAllDB();
        //         });
        //
        //     }
        // }
    }

查:

let car = SaveUtil.getInstance().getRealm().objects('Car').filtered('id = 0');
let cars = SaveUtil.getInstance().getRealm().objects('Car');

example
 //查找所有的数据
    getAllDB() {
        console.log("getAllDB");
        let cars = null;
        cars = SaveUtil.getInstance().getRealm().objects('Car');
        this.setState((prevState) => ({allDatas: cars}), () => {

        })

    }

删:

删除全部
 //删除所有数据
    deleteAllDB() {
        let cars = null;
        cars = SaveUtil.getInstance().getRealm().objects('Car');
        SaveUtil.getInstance().getRealm().write(() => {
            SaveUtil.getInstance().getRealm().delete(cars);
            this.getAllDB();
        })

    }
删除指定
//删除数据
    deleteDB() {
        let cars = null;
        cars = SaveUtil.getInstance().getRealm().objects('Car');
        SaveUtil.getInstance().getRealm().write(() => {
            SaveUtil.getInstance().getRealm().delete(cars[cars.length - 1]);
            this.getAllDB();
        })

    }

升级:升级和创建/打开数据一样,只是需要放入新的数据model和新的版本号

//更新数据库版本
    updateDBVersion() {
        console.log("updateDBVersion");
        //设置新的存储结构,设置他的新版本号
        //注意 这个update必须是在数据库关闭的情况下调用,否则不能更新
        Realm.open({schema: [UpdateCarSchema, PersonSchema], schemaVersion: 1})
            .then(realm => {
                this.setState((prevState) => ({realm: realm}), () => {
                    this.getAllDB();
                })
            })
            .catch(error => {
                Alert.alert('更新数据库失败:' + error)
                console.log(error);
            });
    }

猜你喜欢

转载自blog.csdn.net/shb2058/article/details/84956373