领域js:访问无效的Results对象

时间:2018-10-15 07:24:38

标签: realm realm-js

我在React本机应用程序中使用领域,尝试从领域数据库中查询对象列表。

function* loadPlaces() {
    let realm;
    try {
        const filter = yield select(getFilter);
        realm = yield call(Realm.open, {schema: [PlaceSchema]});
        let places = realm.objects(PlaceSchema.name);
        if (filter.search) {
            places = places.filtered("name CONTAINS $0", filter.search);
        }
        switch (filter.sort) {
            case Sort.BY_NAME:
                places = places.sorted('name');
                break;
        }
        yield put(loadPlacesSucceed(places));
    } catch (e) {
        console.warn(e.message);
    } finally {
        if (realm) {
            realm.close();
        }
    }
}

之后,我将结果数据用于平面列表:

<FlatList
        data={this.props.items}
        keyExtractor={(item) => '' + item.id}
        renderItem={({item}) =>
            <PlaceItem item={item} onClick={(item) => this._onItemClicked(item)}/>}/>

并收到错误:

  

访问无效的Results对象。

如果我删除了realm.close()错误消失,但是我需要在查询后关闭领域。

2 个答案:

答案 0 :(得分:1)

为什么您认为在查询后需要关闭Realm?如果关闭领域,您将无法访问所有自动更新的集合,例如Results,因此,只要需要访问特定的Results实例,就不应关闭领域。

答案 1 :(得分:1)

发生这种情况是因为一旦realm关闭,所有对数据的访问(在当前情况下为Results)都将丢失。

但是,正如OP "not close it at all"所述,这不是一个好方法。理想情况下,应将其关闭。您可以看到official documentation说,

//请记住在完成后关闭领域。

因此,您基本上可以做的是,在realm中打开componentDidMount,然后在componentWillUnmount中将其关闭。

就像

componentDidMount() {
    Realm.open({
        schema: [{ name: 'SCHEMA_NAME', properties: { name: 'string' } }]
    }).then(realm => {
        this.setState({ realm });
    });
}

componentWillUnmount() {
    // Close the realm if there is one open.
    const { realm } = this.state;
    if (realm !== null && !realm.isClosed) {
        realm.close();
    }
}