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

问题描述 投票:0回答:1

我正在使用一个将事务存储在本地SQLite本地数据库中的应用程序,我正在使用Room。我有2个活动,其中包括MainActivity,其中有一个包含所有交易(添加,删除交易)的回收者视图,还有一个带您进入具有交易图表的其他活动(图表活动)的按钮。

现在,如果数据库中没有事务,那么我不想允许用户进入Chart活动(因为那里看不到任何东西)。

这是我的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);
}

我的ViewModel

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

MainActivity:

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

        }
    });

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

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

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

android android-sqlite android-room android-livedata
1个回答
0
投票

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

例如:取一个布尔值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();
        }
    });
}
© www.soinside.com 2019 - 2024. All rights reserved.