Как правильно заменить первичные ключи на новое свойство в Realm? - PullRequest
0 голосов
/ 26 июня 2018

Я добавил новое свойство в мою схему. Это свойство является новым первичным ключом. (В реальной жизни этот первичный ключ соответствует составному ключу ключа записи и ключа для пользователя.)

Мой код работает. Однако это кажется сложным (необходимо преобразовать результаты в массив и затем их клонировать):

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);
    });
}
...