gpt4 book ai didi

arrays - React-native Sqlite,强制 ListView 用新数据更新

转载 作者:行者123 更新时间:2023-12-03 19:31:46 25 4
gpt4 key购买 nike

我在 sqlite 文件中有 2 个表,我试图根据选择器选择更改 ListView 的内容。

查询运行良好,但 ListView 仍显示旧数据。
我如何强制 ListView 使用新数据进行回收?

如果我使用搜索输入,则会显示新数据。

  constructor(props) {
super(props);
this.state = {
query: null,
selected1: 'table01',
progress: [],
dataSource: new ListView.DataSource({
rowHasChanged: (row1, row2) => { row1 !== row2; },
}),
searchText: '',
filteredData: [],

};
}

componentWillMount() {
this.callQuery();
}

componentWillUnmount() {
this.closeDatabase();
}

callQuery() {
if (this.state.selected1 === 'table01') {
this.setState({ query: 'select * from table01' }, this.openDB());
} else if (this.state.selected1 === 'table02') {
this.setState({ query: 'select * from table02' }, this.openDB());
} else {
console.log('Error creating query');
}
}
openDB() {
const that = this;
db.transaction((tx) => {
tx.executeSql(this.state.query, [], (tx, results) => {
console.log('Query completed');
that.setState(that.state);
const len = results.rows.length;

this.setState({ progress: [] });

for (let i = 0; i < len; i++) {
const row = results.rows.item(i);
const obj = {
code: row.cod,
name: row.name,
};
that.state.progress.push(obj);
}
that.setState(that.state);
});
});
}




setSearchText = (event) => {
const searchText = event.nativeEvent.text;
const text = searchText.toLowerCase();
const data = this.state.progress;
const filteredArray = data.filter((item) => {
if (item.name && item.code) {
const itemName = item.name.toLowerCase();
const codeName = item.code.toLowerCase();
return (itemName.search(text) !== -1 || codeName.search(text) !== -1);
}
return false;
});
this.setState({
filteredData: filteredArray,
searchText,
});
};

onValueChange(key: string, value: string) {
const newState = {};
newState[key] = value;
this.setState(newState);
this.callQuery();
}

renderProgressEntry(entry) {
return (<View>
<Text style={styles.backTextWhite}>{entry.name}</Text>
</View>);
}


render() {
const ds = new ListView.DataSource({ rowHasChanged: (row1, row2) => { row1 !== row2; } });
const data = this.state.searchText ? this.state.filteredData : this.state.progress;
return (
<Picker
mode="dropdown"
selectedValue={this.state.selected1}
onValueChange={this.onValueChange.bind(this, 'selected1')}
>
<Item label="table01" value="table01" />
<Item label="table02" value="table02" />
</Picker>
<Input
onSubmitEditing={this.setSearchText.bind(this)}
autoCapitalize="none"
autoCorrect={false}
returnKeyType="go"
/>
<ListView
initialListSize={1}
pageSize={1}
removeClippedSubviews
enableEmptySections
dataSource={ds.cloneWithRows(data)}
renderRow={this.renderProgressEntry}
style={{ flex: 1 }}
/>

最佳答案

问题是选择器值设置不正确,还添加了箭头函数调用。

  onValueChange(key: string, value: string) {
this.setState({
selected1: value,
}, () => { this.callQuery(); });
}

关于arrays - React-native Sqlite,强制 ListView 用新数据更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40171631/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com