Область js: доступ к недействительным объектам Results

Я использую область внутри моего собственного приложения 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(), ошибка исчезнет, ​​но мне нужно закрыть область после запроса.

1 ответ

Решение

Почему вы думаете, что вам нужно закрыть Realm после запроса? Если вы закроете свое Царство, вы потеряете доступ ко всем автоматически обновляемым коллекциям, таким как Results, поэтому вы не должны закрывать свое Царство, пока вам нужен доступ к определенному Results пример.

Это происходит потому, что как только realm закрыт, весь доступ к данным, который в данном случае Results, потерян.

Однако, как упоминалось OP "not close it at all"не лучший подход. В идеале он должен быть закрыт. Вы можете видеть, что в официальной документации говорится:

// Не забудьте закрыть область, когда закончите.

Итак, что вы можете сделать, это открыть 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();
    }
}
Другие вопросы по тегам