React Native中Realm创建workoutData时sets主键重复(_id=6)报错
React Native Realm 训练历史存储主键重复问题解决
在React Native中使用Realm存储训练历史时,调用addHistory创建workoutData对象时抛出主键重复错误:Error: Exception in HostFunction: Attempting to create an object of type 'sets' with an existing primary key value '6'。前序逻辑中已为新sets分配新ID,但仍触发该错误。
相关代码
addHistory 函数实现
export function addHistory(workout, exercise, sets, _id) { console.log({ workout, exercise, sets, _id, }); if ( _id !== undefined && workout !== undefined && exercise !== undefined && sets !== undefined ) { return realm.write(() => { return realm.create("workoutData", { _id: _id, exercise, workout, sets, workoutDate: new Date(Date.now()), }); }); } else { alert("History is incomplete"); } }
workoutData Schema
exports.workoutData = { name: "workoutData", primaryKey: "_id", properties: { _id: "int", workout: "workouts", exercise: "exercise", workoutDate: "date", sets: "sets[]", }, };
解决方案
确认
sets主键唯一性:在finishWorkoutHandler中打印所有sets对象的主键值,排查是否存在重复:setsArrCopy.forEach(set => console.log('Set ID:', set._id));若发现重复,修正ID生成逻辑,确保每次生成的主键都是Realm中不存在的新值。
使用Realm更新策略:修改
realm.create调用,添加第三个参数true,允许更新已存在的嵌套sets对象,避免主键冲突:return realm.write(() => { return realm.create("workoutData", { _id: _id, exercise, workout, sets, workoutDate: new Date(Date.now()), }, true); // 允许更新已存在的嵌套对象 });检查
setsSchema配置:若业务不需要sets的主键,可移除其主键配置;若需要主键,确保生成逻辑无重复:// 示例:移除sets的主键配置 exports.sets = { name: "sets", properties: { weight: "float", reps: "int", // ...其他属性 }, };转换为纯JavaScript对象:若
setsArrCopy中的对象是从Realm查询出的已有对象,需转换为纯JS对象后再传入:const plainSets = setsArrCopy.map(set => ({...set})); addHistory(workout, exercise, plainSets, _id);
内容的提问来源于stack exchange,提问作者Wahas Ali Mughal
相关产品推荐
相关产品推荐

