【问题标题】:Cannot get data from SQLite Room Database using dates无法使用日期从 SQLite Room 数据库获取数据
【发布时间】:2022-01-26 06:27:08
【问题描述】:

我有一个像这样的类型转换器

public class DateConverter {
    @TypeConverter
    public static Date convertLongToDate(Long dateLong) {
        return dateLong == null ? null : new Date(dateLong);
    }

    @TypeConverter
    public static Long convertDateToLong(Date date) {
        return date == null ? null : date.getTime();
    }
    
    ...
}

我在我的数据库中使用它

@Database(entities = { LoginEntity.class,
        Transaction.class,
        UnsentTagNumbers.class }, version = 11, exportSchema = false)
@TypeConverters(DateConverter.class)
public abstract class ApplicationDatabase extends RoomDatabase {
    public abstract LoginDao loginDao();
    ...
}

在将事务插入数据库时​​,我是这样做的。

public void recordTransaction() {
    transaction.setTransactionDate(Calendar.getInstance().getTime()); <==== Please take note on the way that I use the current date.
    transaction.setTransactionType(getApplication().getString(R.string.exit_scan));
    ...
    transactionRepository.insert(transaction);
}

在我的 DAO 中

@Query("SELECT * FROM TRANSACTION_TABLE WHERE transactionDate >= :fromDate AND transactionDate <= :toDate AND staffId = :staffId")
LiveData<List<Transaction>> getTransactionSummaryByDates(Date fromDate, Date toDate, String staffId);

这是我按日期搜索交易的方式

public void onClick(View v) {
    switch (v.getId()) {
    case R.id.btnStartDate:
            if(!hasSelectedStaffId) {
                Toast.makeText(this, "Select a staff id first.", Toast.LENGTH_SHORT).show();
                return;
            }
            Calendar cldr = Calendar.getInstance();
            int day = cldr.get(Calendar.DAY_OF_MONTH);
            int month = cldr.get(Calendar.MONTH);
            int year = cldr.get(Calendar.YEAR);
            dpdStartDate = new DatePickerDialog(this,
                    new DatePickerDialog.OnDateSetListener() {
                        @Override
                        public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
                            hasSelectedStartDate = true;
                            startDate = new Date(year, monthOfYear, dayOfMonth, 0, 0, 0);
                            btnStartDate.setText(dayOfMonth + "/" + (monthOfYear + 1) + "/" + year);
                        }
                    }, year, month, day);
            dpdStartDate.show();
            break;
        case R.id.btnEndDate:
            cldr = Calendar.getInstance();
            day = cldr.get(Calendar.DAY_OF_MONTH);
            month = cldr.get(Calendar.MONTH);
            year = cldr.get(Calendar.YEAR);
            dpdEndDate = new DatePickerDialog(this,
                    new DatePickerDialog.OnDateSetListener() {
                        @Override
                        public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
                            endDate = new Date(year, monthOfYear, dayOfMonth, 23, 59, 59);
                            btnEndDate.setText(dayOfMonth + "/" + (monthOfYear + 1) + "/" + year);
                            if (hasSelectedStartDate && hasSelectedStaffId) {
                                viewModel.getTransactions(startDate, endDate, selectedStaffId);
                                transactionAdapter.setTransactionList(transactionList);
                                transactionAdapter.notifyDataSetChanged();
                            }
                        }
                    }, year, month, day);
            dpdEndDate.show();
            break;
    }
}

这是在我的视图模型中获取交易

public void getTransactions(Date startDate, Date endDate, String staffId) {
    transactionList = transactionRepository.getTransactionSummaryByDates(startDate, endDate, staffId);
}

怎么回事,我没有从数据库中得到任何信息?如果我检查我的数据库,则会记录交易。请看图片。

这是我发送的参数,因此我可以通过日期获取

开始日期:1 月 25 日星期三 00:00:00 GMT+08:00 3922 结束日期:1 月 26 日星期四 23:59:59 GMT+08:00 3922 员工编号:10164

但是,如果我将从 datepicker 获得的日期转换为这样的纪元:

if (hasSelectedStartDate && hasSelectedStaffId) {
    Long lStartDate = startDate.getTime();
    Long lEndDate = endDate.getTime();
                                  
    viewModel.getTransactions(lStartDate, lEndDate, selectedStaffId);
                                 
    //viewModel.getTransactions(startDate, endDate, selectedStaffId);
    //setupTransactionList();
                            }

我注意到在我的数据库中,日期是 16431...但是当我查询并转换我的日期参数时,它是 6060....

我该如何做到这一点?

【问题讨论】:

  • 在您的数据库中,日期存储为历元(以毫秒为单位)。
  • 这能回答你的问题吗? Convert UTC Epoch to local date
  • @kiner_shah 那么我是否必须更改插入日期的方式或获取日期的方式?
  • 在从数据库检索后,您可能必须更改从纪元转换日期的方式。
  • 感谢您抽出时间@kiner_shah。我明白了。

标签: java android android-studio android-room


【解决方案1】:

我的错误在于 onClick(View ...) 的代码。我刚刚将我的日期选择器转换为日历并从中获取时间..

public void onClick(View v) {
    switch (v.getId()) {
        case R.id.btnStartDate:
            if(!hasSelectedStaffId) {
                Toast.makeText(this, "Select a staff id first.", Toast.LENGTH_SHORT).show();
                return;
            }
            Calendar cldr = Calendar.getInstance();
            int day = cldr.get(Calendar.DAY_OF_MONTH);
            int month = cldr.get(Calendar.MONTH);
            int year = cldr.get(Calendar.YEAR);
            dpdStartDate = new DatePickerDialog(this,
                    new DatePickerDialog.OnDateSetListener() {
                        @Override
                        public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
                            hasSelectedStartDate = true;
                            cldr.set(year, monthOfYear, dayOfMonth, 23, 59, 59);
                            startDate =  cldr.getTime(); //new Date(year, monthOfYear, dayOfMonth, 0, 0, 0);
                            btnStartDate.setText(dayOfMonth + "/" + (monthOfYear + 1) + "/" + year);
                        }
                    }, year, month, day);
            dpdStartDate.show();
            break;
        case R.id.btnEndDate:
            if(!hasSelectedStaffId) {
                Toast.makeText(this, "Select a staff id first.", Toast.LENGTH_LONG).show();
                return;
            }
            if(!hasSelectedStartDate) {
                Toast.makeText(this, "Select a start date first.", Toast.LENGTH_LONG).show();
                return;
            }
            cldr = Calendar.getInstance();
            day = cldr.get(Calendar.DAY_OF_MONTH);
            month = cldr.get(Calendar.MONTH);
            year = cldr.get(Calendar.YEAR);
            dpdEndDate = new DatePickerDialog(this,
                    new DatePickerDialog.OnDateSetListener() {
                        @Override
                        public void onDateSet(DatePicker view, int year, int monthOfYear, int dayOfMonth) {
                            cldr.set(year, monthOfYear, dayOfMonth, 23, 59, 59);
                            endDate = cldr.getTime();
                            btnEndDate.setText(dayOfMonth + "/" + (monthOfYear + 1) + "/" + year);
                            if (hasSelectedStartDate && hasSelectedStaffId) {
                                viewModel.getTransactions(startDate, endDate, selectedStaffId);
                                setupTransactionList();
                            }
                        }
                    }, year, month, day);
            dpdEndDate.show();
            break;
    }
}

endDate = new Date(year, monthOfYear, dayOfMonth, 23, 59, 59); 具有不同的格式,因此由于我在保存时使用的是“日历”实例,因此我认为它应该是一个“日历”实例,我应该将其作为参数传递。

【讨论】:

    猜你喜欢
    • 2021-02-16
    • 2019-10-13
    • 1970-01-01
    • 2018-05-28
    • 2012-01-06
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多