【问题标题】:Change SQL query based on button action根据按钮操作更改 SQL 查询
【发布时间】:2023-03-13 20:56:01
【问题描述】:

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

根据按钮推送更改应用中正在运行的查询并更新列表视图的最佳方法是什么?

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

标志是布尔过滤器今天。在 todayButton 的 onClickListener 中设置。

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);
        }
    });

}
}

这是我试图在两个查询之间切换:

public Cursor getAllTasks() {
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor res =  db.rawQuery( "SELECT * FROM " + TASK_TABLE_NAME, null );
    return res;
}

public Cursor getTodaysTasks(String date){
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor res = db.rawQuery("SELECT * FROM " + TASK_TABLE_NAME + " WHERE " +
            TASK_COLUMN_DATE + " =?", new String[]{date});
    return res;
}

【问题讨论】:

  • 你能分享你当前的实现吗?
  • 我添加了代码。我不确定为什么在按钮单击时标志永远不会改变,标志甚至是最好的方法吗?

标签: java android sqlite android-sqlite


【解决方案1】:

好的,所以首先要注意的是,onclick 侦听器内部的 filterToday = true; 更新,外部的 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();
}

}

onclicklistner 内部调用这个函数

 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

我在这里并不是建议改进代码。只是改变你已经拥有的东西。希望对您有所帮助。

【讨论】:

  • 在程序的顶部,我为标志创建了一个布尔值,所以据我了解,这对两者都是可见的,对吗?我没有在 onCreate() 范围内定义布尔值,因此它应该使用下一个范围中的对象,直到我的理解。
  • 那里没问题。当您单击按钮时,它只会更新标志,不会对列表做任何事情。这就是建议的更改,更新标志并使用更改的标志再次调用查询。
【解决方案2】:

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

根据这个答案:Refresh Current Fragment (ListView Data) remaining in the same activity

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

【讨论】:

    猜你喜欢
    • 2014-11-16
    • 2017-10-28
    • 2013-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-13
    • 2021-04-28
    相关资源
    最近更新 更多