Java 基于按钮操作更改SQL查询

Java 基于按钮操作更改SQL查询,java,android,sqlite,android-sqlite,Java,Android,Sqlite,Android Sqlite,我有一个显示数据库中所有项目的列表视图。我正在尝试创建一个按钮,该按钮将更改显示的数据,以仅显示与今天日期匹配的项目 基于按钮按下并更新listview,更改应用程序中正在运行的查询的最佳方式是什么 我在onclick()方法中设置了一个标志,并与保存查询调用的if-else语句配对,但它似乎没有切换调用的对象 该标志是今天的布尔过滤器。在onClickListener的Today按钮中设置 public class MainActivity extends AppCompatActivity

我有一个显示数据库中所有项目的列表视图。我正在尝试创建一个按钮,该按钮将更改显示的数据,以仅显示与今天日期匹配的项目

基于按钮按下并更新listview,更改应用程序中正在运行的查询的最佳方式是什么

我在onclick()方法中设置了一个标志,并与保存查询调用的if-else语句配对,但它似乎没有切换调用的对象

该标志是今天的布尔过滤器。在onClickListener的Today按钮中设置

public class MainActivity extends AppCompatActivity {


public final static String KEY_EXTRA_CONTACT_ID = "KEY_EXTRA_CONTACT_ID";
private ListView listView;
DBHelper dbHelper;
boolean filterToday;
Cursor cursor;
String [] columns;
int [] widgets;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Button addButton = (Button) findViewById(R.id.addNew);
    addButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent = new Intent(MainActivity.this, AddTaskActivity.class);
            intent.putExtra(KEY_EXTRA_CONTACT_ID, 0);
            startActivity(intent);
        }
    });

    Button todayButton = (Button) findViewById(R.id.today);
    todayButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            filterToday = true;
        }
    });

    dbHelper = new DBHelper(this);

    if(filterToday == true){
        Calendar cal = Calendar.getInstance();
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        String date = df.format(cal.getTime());
        Toast.makeText(this,date,Toast.LENGTH_LONG).show();
        cursor = dbHelper.getTodaysTasks(date);
    }

    else{
        cursor = dbHelper.getAllTasks();
    }

    columns = new String[] {
            DBHelper.TASK_COLUMN_NAME,
            DBHelper.TASK_COLUMN_TYPE,
            DBHelper.TASK_COLUMN_DATE

    };
    widgets = new int[] {
            R.id.taskName,
            R.id.taskType,
            R.id.taskDate
    };


    SimpleCursorAdapter cursorAdapter = new SimpleCursorAdapter(this, R.layout.task_info,
            cursor, columns, widgets, 0);
    listView = (ListView)findViewById(R.id.listView1);
    listView.setAdapter(cursorAdapter);

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> listView, View view,
                                int position, long id) {
            Cursor itemCursor = (Cursor) MainActivity.this.listView.getItemAtPosition(position);
            int taskID = itemCursor.getInt(itemCursor.getColumnIndex(DBHelper.TASK_COLUMN_ID));
            Intent intent = new Intent(getApplicationContext(), AddTaskActivity.class);
            intent.putExtra(KEY_EXTRA_CONTACT_ID, taskID);
            startActivity(intent);
        }
    });

}
}

好的,首先要注意的是更新
filterToday=true
onclick
侦听器中,外部的
if(filterToday==true){…}
不知道这一点。该部分仅在
oncreate()中执行一次

如果你想做那件事,我建议你做个小改动。。如下

为数据加载在外部创建一个单独的函数

private void LoadMyData() {

if(filterToday == true){
    Calendar cal = Calendar.getInstance();
    DateFormat df = new SimpleDateFormat("yyyy-MM-dd");

    String date = df.format(cal.getTime());
    //you might need to update this line
   //Toast.makeText(this,date,Toast.LENGTH_LONG).show();

   //assume dbHelper is ready at this point
    cursor = dbHelper.getTodaysTasks(date);
}

else{
    cursor = dbHelper.getAllTasks();
}

}
onclick
listner中调用此函数

 filterToday = false;//initialize to false if necessary
 todayButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        filterToday = !filterToday ;//by doing it like this you can switch back and forth. add/check extra logic if necessary
        LoadMyData();
    }
});
LoadMyData(); //Call this outside in the oncreate to load the data initially

我不是在建议代码改进。只是改变你已经拥有的。希望能有所帮助。

我遇到了两个问题,第一个是将字符串与SQL字符串[]进行比较,这意味着在进行比较时,它的行为与我预期的不同。解决此问题后,将更新ListView对象。这是通过创建一个新的适配器并将其附加到ListView来处理的,然后ListView会自我更新

根据这一回答:


另一个选项是在适配器上调用notifyDataSetChanged(),但这与我设置程序的方式不太一致。

您可以共享当前的实现吗?我添加了代码。我不知道为什么在点击按钮的时候,这个标志永远不会被改变,而且这个标志是最好的方法吗?在程序的顶部,我为这个标志创建了一个布尔值,所以据我所知,它对双方都是可见的,对吗?我没有在onCreate()范围内定义布尔值,因此它应该使用下一个范围内的对象,直到我理解为止。没有问题。当你点击按钮时,它只会更新标志,而不会对列表做任何事情。这就是建议的更改,更新标志,并使用更改的标志再次调用查询。
 filterToday = false;//initialize to false if necessary
 todayButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        filterToday = !filterToday ;//by doing it like this you can switch back and forth. add/check extra logic if necessary
        LoadMyData();
    }
});
LoadMyData(); //Call this outside in the oncreate to load the data initially