我如何从实时数据中获取列表?

How can i get a list from livedata?

我正在开发一个将事务存储在本地 SQLite 本地数据库中的应用程序,我正在使用 Room。我有 2 个活动,其中一个是 MainActivity,其中我有一个包含所有交易(添加、删除交易)的回收者视图,还有一个按钮,可以将您带到另一个 activity(图表 activity),它有一个交易图表。

现在,如果数据库中没有交易,我不想让用户转到图表 activity(因为那里什么也看不到)。

这是我的 Dao 中的查询:

@Query("SELECT * FROM transaction_table WHERE amount < 0 AND strftime('%m', creationDate) = :month")
LiveData<List<Transaction>> getNegativeTransactionsByMonth(String month);

我的存储库:

public LiveData<List<Transaction>> getAllNegativeTransactionsByMonth(String month) {
    return transactionDao.getNegativeTransactionsByMonth(month);
}

我的视图模型

public LiveData<List<Transaction>> getAllNegativeTransactionsByMonth(String month) {
    return repository.getAllNegativeTransactionsByMonth(month);
}

主要活动:

btnChart.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            final LiveData<List<Transaction>> viewModelData2 = transactionViewModel.getTransactionsByMonth(currentMonth);
            viewModelData2.observe(MainActivity.this, new Observer<List<Transaction>>() {
                @Override
                public void onChanged(List<Transaction> transactions) {
                    if(!transactions.isEmpty()) {
                        Intent intent = new Intent(getApplicationContext(), ChartActivity.class);
                        intent.putExtra("SELECTED_MONTH_NUMBER", SELECTED_MONTH_NUMBER);
                        startActivity(intent);
                    } else {
                        Toast.makeText(MainActivity.this, "Add a negative transaction to look at the chart", Toast.LENGTH_SHORT).show();
                    }
                }
            });

        }
    });

在上面的代码中,我有一个用于将您带到图表 activity 的按钮的侦听器。我为 ViewModel 数据创建了一个观察者,并将逻辑放在未更改的方法中,如果交易不为空,则启动图表 activity,如果不显示祝酒词。

问题是每次创建新事务时 if 子句 都是 运行(运行未更改的方法)。 我不想要这个,我希望 if 子句仅在我按下图表按钮时 运行。

我知道我想实现的可能无法用 LiveData 实现。 这就是为什么我要寻求一种从数据库中获取交易列表并检查它是否为空的方法。欢迎任何帮助。谢谢。

我建议你从 setOnClickListener 中取出一个观察者并使用布尔标志转到下一个 activity。

例如: 取一个布尔值 isTransactionsEmpty 并制作一种方法来观察变化,根据列表是否为空将布尔值设置为 true 或 false。

boolean isTransactionsEmpty = true;

void onCLicks(){
    btnChart.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(!isTransactionsEmpty) {
                Intent intent = new Intent(getApplicationContext(), ChartActivity.class);
                intent.putExtra("SELECTED_MONTH_NUMBER", SELECTED_MONTH_NUMBER);
                startActivity(intent);
            } else {
                Toast.makeText(MainActivity.this, "Add a negative transaction to look at the chart", Toast.LENGTH_SHORT).show();
            }
        }
    });
}

void observeTransactionList(){
    transactionViewModel.getTransactionsByMonth(currentMonth).observe(MainActivity.this, new Observer<List<Transaction>>() {
        @Override
        public void onChanged(List<Transaction> transactions) {
            isTransactionsEmpty = transactions.isEmpty();
        }
    });
}