代码之家  ›  专栏  ›  技术社区  ›  Jesus is Lord

在领域中将主键更改为新属性的正确方法是什么?

  •  0
  • Jesus is Lord  · 技术社区  · 6 年前

    我向架构添加了一个新属性。该属性是新的主键。(在现实生活中,这个主键对应于记录键和用户键的组合键。)

    我的代码有效。但是,它感觉很复杂(必须将结果转换为数组,然后克隆它们):

    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);
        });
    }
    
    0 回复  |  直到 6 年前