Я добавил новое свойство в мою схему. Это свойство является новым первичным ключом. (В реальной жизни этот первичный ключ соответствует составному ключу ключа записи и ключа для пользователя.)
Мой код работает. Однако это кажется сложным (необходимо преобразовать результаты в массив и затем их клонировать):
function migrationThatWorks(oldRealm, newRealm) {
let results = readRecords(newRealm);
let cloned = clone(_.values(results));
newRealm.delete(results);
cloned.forEach(r => r.Key = 'test' + r.Id);
cloned.forEach(r => newRealm.create(mySchema, r, true));
readRecords(newRealm);
}
function clone(c) {
return JSON.parse(JSON.stringify(c));
}
Есть ли лучший способ сделать это?
В идеале я бы хотел что-то вроде:
realm.updateAll(mySchema, r => r.Key = 'test' + r.Id);
Вот полный рабочий пример:
var Realm = require('realm');
var _ = require('lodash');
var mySchema = 'MySchema';
v1();
v2();
function v1() {
var schema1 = {
name: mySchema,
primaryKey: 'Id',
properties: {
Id: 'int',
}
};
var realm1 = new Realm({
schema: [
schema1
],
schemaVersion: 1
});
createRecord(realm1, 1);
createRecord(realm1, 2);
readRecords(realm1);
realm1.close();
}
function v2() {
var schema2 = {
name: mySchema,
primaryKey: 'Key',
properties: {
Id: 'int',
Key: 'string',
}
};
let realm2 = new Realm({
schema: [
schema2
],
schemaVersion: 2,
migration: migrationThatWorks,
});
}
function migrationThatWorks(oldRealm, newRealm) {
let results = newRealm.objects(mySchema);
let cloned = clone(_.values(results));
newRealm.delete(results);
cloned.forEach(r => r.Key = 'test' + r.Id);
cloned.forEach(r => newRealm.create(mySchema, r, true));
readRecords(newRealm);
}
function clone(c) {
return JSON.parse(JSON.stringify(c));
}
function readRecords(realm) {
var result = realm.objects(mySchema);
console.log(result);
if (_.values(result).length !== 2) {
throw 'not expecting this';
}
return result;
}
function createRecord(realm, id) {
realm.write(() => {
realm.create(mySchema, {
Id: id,
}, true);
});
}