最大的点: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);
});
}