6

我在我的 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 中使用结果数据:

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

并收到错误:

访问无效的结果对象。

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

4

2 回答 2

6

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

于 2018-10-16T08:27:02.807 回答
2

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

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

// 完成后记得关闭领域。

所以你基本上可以做的是,打开realmcomponentDidMount关闭它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();
    }
}
于 2020-02-05T12:43:13.113 回答