【问题标题】:Is there a way to modify property values by getters and setters using realm database?有没有办法使用领域数据库通过 getter 和 setter 修改属性值?
【发布时间】:2018-06-27 02:51:24
【问题描述】:

使用节点上的realm数据库,当Realm构造一个人时,我需要修改/修剪一个属性值,例如firstName

但是,Realm 文档上的 quote 引起了我的注意:

此时,对通过类定义模型的支持是有限的。它 在 React Native 中有效,但在 Node 中无效。

我不确定当前版本的领域v2.8.0 是否存在我的问题。

class Person {
  set firstName(firstName) {
    this._firstName = firstName.trim();
  }
}

Person.schema = {
  name: 'Person',
  properties: {
    firstName: 'string',
    lastName: 'string'
  }
};

// ---

realm.write(() => {
  const john = realm.create('Person', {
    firstName: ' John  ', // <-- need to be trimmed on model
    lastName: 'Smith'
  });
});

有没有办法通过模型上的 getter/setter 来修改属性值?或者还有其他选择吗?

另一个考虑因素是 Realm 从模型构造对象,如果我使用 setter 甚至在构造函数上修改它们,这也会导致错误。

constructor() {
  this.firstName = this.firstName.trim();
}

无法在写入事务之外修改托管对象。

【问题讨论】:

    标签: javascript node.js realm realm-mobile-platform


    【解决方案1】:

    realm.write(() => {
      const firstName = '  John    ';
      const john = realm.create('Person', {
        firstName: firstName.trim(), // <-- need to be trimmed
        lastName: 'Smith'
      });
    });

    create 方法中将值分配给 firstName 之前,将其存储到另一个变量中并在分配时对其进行修剪?

    【讨论】:

    • 当然可以。但是,我正在寻找一种修改模型类的方法。此外,假设属性值来自前端作为字典。
    • @hallaji:您已将firstName 定义为Person.schema 中的string。请问amend on model class到底是什么意思?
    • 我的意思是像修剪名字或另一个例子,比如从模型的 setter 中的名字中删除特殊字符。
    【解决方案2】:

    基本上,打开一个包含自定义逻辑(例如特定配置和迁移模式)的 Realm:

    import Realm from './realm';
    
    let persister = null;
    
    class Person {
    
      constructor() {
        persister = Realm.open();
      }
    
      get firstName() {
        return this._firstName;
      }
    
      set firstName(firstName) {
        this._firstName = firstName.trim();
      }
    
      async save() {
        try {
          const realm = await persister;
          this.id = uuidv4();
          this.createdAt = Date();
          realm.write(() => {
            realm.create(this.constructor.name, this);
          });
    
          return this;
        } catch (e) {
          this.handleError(e);
        }
      }
    
      // ...
    }
    

    setter/getter 负责属性值,例如修剪等,异步方法将 person 对象保存在 Realm 数据库中,如下所示:

    const person = new Person();
    person.firstName = '      John   ';
    person.lastName = 'Smith';
    
    person.save().then((p) => {
      console.log(p.firstName); // persisted trimmed firstName
    });
    
    // OR within async function:
    let p = await person.save();
    console.log(p.firstName); // persisted trimmed firstName
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多