Область 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();
}
}