我在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()错误消失,但是我需要在查询后关闭领域。
答案 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();
}
}