Arrays 反应本机Sqlite,强制listview使用新数据更新
我在一个sqlite文件中有两个表,\n我试图根据选择器选择更改listview的内容 查询运行正常,但listview仍显示旧数据。 如何强制listview使用新数据进行回收 如果使用搜索输入,将显示新数据Arrays 反应本机Sqlite,强制listview使用新数据更新,arrays,sqlite,listview,react-native,datasource,Arrays,Sqlite,Listview,React Native,Datasource,我在一个sqlite文件中有两个表,\n我试图根据选择器选择更改listview的内容 查询运行正常,但listview仍显示旧数据。 如何强制listview使用新数据进行回收 如果使用搜索输入,将显示新数据 constructor(props) { super(props); this.state = { query: null, selected1: 'table01', progress: [], dataSource:
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 }}
/>
构造函数(道具){
超级(道具);
此.state={
查询:null,
已选择1:“table01”,
进展:[],
数据源:新建ListView.dataSource({
行已更改:(行1,行2)=>{row1!==row2;},
}),
搜索文本:“”,
过滤器数据:[],
};
}
组件willmount(){
this.callQuery();
}
组件将卸载(){
这是closeDatabase();
}
callQuery(){
如果(this.state.selected1=='table01'){
this.setState({query:'select*fromtable01'},this.openDB());
}else if(this.state.selected1==='table02'){
this.setState({query:'select*fromtable02'},this.openDB());
}否则{
log(“创建查询时出错”);
}
}
openDB(){
常数=this;
数据库事务((tx)=>{
tx.executeSql(this.state.query,[],(tx,results)=>{
console.log('querycompleted');
that.setState(that.state);
const len=results.rows.length;
this.setState({progress:[]});
for(设i=0;i{
const searchText=event.nativeEvent.text;
const text=searchText.toLowerCase();
const data=this.state.progress;
常量过滤器Darray=数据过滤器((项)=>{
if(item.name&&item.code){
const itemName=item.name.toLowerCase();
const codeName=item.code.toLowerCase();
return(itemName.search(text)!=-1 | | codeName.search(text)!=-1);
}
返回false;
});
这是我的国家({
Filteredata:filteredArray,
搜索文本,
});
};
onValueChange(键:字符串,值:字符串){
const newState={};
newState[键]=值;
this.setState(newState);
this.callQuery();
}
renderProgressEntry(入口){
返回(
{entry.name}
);
}
render(){
const ds=new ListView.DataSource({rowHasChanged:(row1,row2)=>{row1!==row2;}});
const data=this.state.searchText?this.state.filteredData:this.state.progress;
返回(
问题在于选择器值设置不正确,还添加了箭头函数调用
onValueChange(key: string, value: string) {
this.setState({
selected1: value,
}, () => { this.callQuery(); });
}
我遇到过这些解决方案,但不确定它们如何适合我的场景。