领域 js:访问无效的结果对象

realm js: Access to invalidated Results objects

我在我的 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 [=10=]", 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 中使用结果数据:

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

并收到错误:

Access to invalidated Results objects.

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

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

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

然而,正如 OP "not close it at all" 所提到的,这不是一个好方法。理想情况下,它应该被关闭。你可以看到 official documentation 说,

// Remember to close the realm when finished.

所以你基本上可以做的是,在 componentDidMount 中打开 realm 并在 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();
    }
}