Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 反应本机Sqlite,强制listview使用新数据更新_Arrays_Sqlite_Listview_React Native_Datasource - Fatal编程技术网

Arrays 反应本机Sqlite,强制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:

我在一个sqlite文件中有两个表,\n我试图根据选择器选择更改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 }}
            />
构造函数(道具){
超级(道具);
此.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(); });
  }

我遇到过这些解决方案,但不确定它们如何适合我的场景。