realm.js - 访问已失效或已删除且没有堆栈跟踪的 Contact 类型的对象
realm.js - Accessing object of type Contact which has been invalidated or deleted with NO stack trace
会(真的)感谢对此的帮助。
我有一个领域 listView,它导航到详细视图。
详细视图正在从原始列表视图中删除条目并返回。我已经在领域数据库更改上注册了侦听器以更新列表视图的内容。
这是我正在使用的代码,在删除后出现异常 - "Accessing object of type Contact which has been invalidated or deleted" 在导航发生后。
有人知道为什么吗?
此外,更改侦听器 (updateContactsFromDB) 似乎被调用了两次,而只删除了一个对象 - ideas?
10 倍
ContactPage.js:
export default class ContactsPage extends Component {
updateContactsFromDB(){
console.log("ContactsPage:updateContactsFromDB()");
let contacts = Realm.objects('Contact');
this.setState({
dataSource: this.state.dataSource.cloneWithRows(contacts.snapshot()),
});
}
constructor(props) {
console.log("ContactsPage:constructor()");
super(props);
const ds = new ListView.DataSource({rowHasChanged: (r1, r2) => (r1 !== r2)});
let contacts = Realm.objects('Contact');
this.state = {
dataSource: ds.cloneWithRows(contacts.snapshot()),
};
this.updateContactsFromDB = this.updateContactsFromDB.bind(this);
}
componentWillMount(props){
console.log("ContactsPage:componentWillMount");
Realm.addListener('change', this.updateContactsFromDB);
}
componentWillUnmount(props){
console.log("ContactsPage:componentWillUnmount");
Realm.removeListener('change', this.updateContactsFromDB);
}
render() {
console.log("ContactsPage:render()");
return (
<ListView
dataSource={this.state.dataSource}
renderRow={(contact) => (
<TouchableOpacity onPress={ () => this.props.navigation.navigate('ContactNotesPage', { contact: contact}) }>
<Text>test Contact</Text>
</TouchableOpacity>
)
}
/>
);
}
}
ContactNotesPage.js:
export default class ContactNotesPage extends Component {
constructor(props) {
console.log("ContactNotesPage:constructor");
super(props);
}
render(){
console.log("ContactNotesPage:render()");
const { params } = this.props.navigation.state;
return (
<TouchableOpacity onPress={ () => {
console.log("ContactNotesPage:delete");
Realm.write(() => { Realm.delete(params.contact);});
this.props.navigation.navigate('ContactsPage');
}
}>
<Text>DeleteContact</Text>
</TouchableOpacity>
)
}
};
// main.js
const MainStack = StackNavigator({
ContactsPage: {
screen: ContactsPage,
},
ContactNotesPage:{
screen: ContactNotesPage,
},
});
export default MainStack;
似乎是 realm/react-navigation 中的错误。传递作为领域对象的参数时 - 如果删除此对象,则下一次导航将失败。
错误已在 https://github.com/realm/realm-js/issues/1031
处打开
当您从领域获取对象(使用 realm.objects('collection'))并在其上使用 realm.close() 函数时,会发生这种情况。使用 Object.assign 方法或解构对象或数组方法来缓解此问题。如下图,
const realmObject = realm.objects('collection');
const obj = [...realmObject] or {...realmObject[0]}; // the later one when filtered is used on realmObject.
我的解决方案是我没有调用 realm.close() 因为我一直在处理数据库。
https://realm.io/docs/javascript/0.14.0/api/Realm.html#close
我在删除数组中的项目后使用 @react-navigation/native 的 useFocusEffect 来像这样更新列表数组
//state to check get data ability:
const [getDataAbility, setGetDataAbility] = useState(true);
//useFocusEffect
useFocusEffect(
React.useCallback(() => {
if (getDataAbility === true) {
// handle data
}
}, [ dependencies... ]),
);
// catch error ""accessing obj of..."
try {
console.log(pickingItem.id);
} catch (error) {
setGetDataAbility(false);
console.log('err picking: ', error);
}
-> 求解
这对我有用:
async function updateRealm() {
const realm = Realm.open({
schemas: [
/*myschemas*/
]
});
realm.addListener('change', () => {
/* consult function */
});
}
会(真的)感谢对此的帮助。
我有一个领域 listView,它导航到详细视图。
详细视图正在从原始列表视图中删除条目并返回。我已经在领域数据库更改上注册了侦听器以更新列表视图的内容。
这是我正在使用的代码,在删除后出现异常 - "Accessing object of type Contact which has been invalidated or deleted" 在导航发生后。
有人知道为什么吗?
此外,更改侦听器 (updateContactsFromDB) 似乎被调用了两次,而只删除了一个对象 - ideas?
10 倍
ContactPage.js:
export default class ContactsPage extends Component {
updateContactsFromDB(){
console.log("ContactsPage:updateContactsFromDB()");
let contacts = Realm.objects('Contact');
this.setState({
dataSource: this.state.dataSource.cloneWithRows(contacts.snapshot()),
});
}
constructor(props) {
console.log("ContactsPage:constructor()");
super(props);
const ds = new ListView.DataSource({rowHasChanged: (r1, r2) => (r1 !== r2)});
let contacts = Realm.objects('Contact');
this.state = {
dataSource: ds.cloneWithRows(contacts.snapshot()),
};
this.updateContactsFromDB = this.updateContactsFromDB.bind(this);
}
componentWillMount(props){
console.log("ContactsPage:componentWillMount");
Realm.addListener('change', this.updateContactsFromDB);
}
componentWillUnmount(props){
console.log("ContactsPage:componentWillUnmount");
Realm.removeListener('change', this.updateContactsFromDB);
}
render() {
console.log("ContactsPage:render()");
return (
<ListView
dataSource={this.state.dataSource}
renderRow={(contact) => (
<TouchableOpacity onPress={ () => this.props.navigation.navigate('ContactNotesPage', { contact: contact}) }>
<Text>test Contact</Text>
</TouchableOpacity>
)
}
/>
);
}
}
ContactNotesPage.js:
export default class ContactNotesPage extends Component {
constructor(props) {
console.log("ContactNotesPage:constructor");
super(props);
}
render(){
console.log("ContactNotesPage:render()");
const { params } = this.props.navigation.state;
return (
<TouchableOpacity onPress={ () => {
console.log("ContactNotesPage:delete");
Realm.write(() => { Realm.delete(params.contact);});
this.props.navigation.navigate('ContactsPage');
}
}>
<Text>DeleteContact</Text>
</TouchableOpacity>
)
}
};
// main.js
const MainStack = StackNavigator({
ContactsPage: {
screen: ContactsPage,
},
ContactNotesPage:{
screen: ContactNotesPage,
},
});
export default MainStack;
似乎是 realm/react-navigation 中的错误。传递作为领域对象的参数时 - 如果删除此对象,则下一次导航将失败。 错误已在 https://github.com/realm/realm-js/issues/1031
处打开当您从领域获取对象(使用 realm.objects('collection'))并在其上使用 realm.close() 函数时,会发生这种情况。使用 Object.assign 方法或解构对象或数组方法来缓解此问题。如下图,
const realmObject = realm.objects('collection');
const obj = [...realmObject] or {...realmObject[0]}; // the later one when filtered is used on realmObject.
我的解决方案是我没有调用 realm.close() 因为我一直在处理数据库。
https://realm.io/docs/javascript/0.14.0/api/Realm.html#close
我在删除数组中的项目后使用 @react-navigation/native 的 useFocusEffect 来像这样更新列表数组
//state to check get data ability:
const [getDataAbility, setGetDataAbility] = useState(true);
//useFocusEffect
useFocusEffect(
React.useCallback(() => {
if (getDataAbility === true) {
// handle data
}
}, [ dependencies... ]),
);
// catch error ""accessing obj of..."
try {
console.log(pickingItem.id);
} catch (error) {
setGetDataAbility(false);
console.log('err picking: ', error);
}
-> 求解
这对我有用:
async function updateRealm() {
const realm = Realm.open({
schemas: [
/*myschemas*/
]
});
realm.addListener('change', () => {
/* consult function */
});
}