[英]Cannot get data from SQLite Room Database using dates
I have a typeconverter that goes like this我有一个像这样的类型转换器
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();
}
...
}
And I use it in my database我在我的数据库中使用它
@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();
...
}
In inserting the transaction to the database, I do it like so.在将事务插入数据库时,我是这样做的。
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);
}
In my DAO在我的 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);
This is how I search for the transactions by dates这就是我按日期搜索交易的方式
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;
}
}
And this is in my viewmodel to get the transactions这是在我的视图模型中获取交易
public void getTransactions(Date startDate, Date endDate, String staffId) {
transactionList = transactionRepository.getTransactionSummaryByDates(startDate, endDate, staffId);
}
How come, I do not get any information from the database?怎么,我没有从数据库中得到任何信息? If I check my database, the transactions are recorded.
如果我检查我的数据库,则会记录交易。 Please see image.
请看图片。
This is the parameters I send so I can get via dates这是我发送的参数,因此我可以通过日期获取
startDate: Wed Jan 25 00:00:00 GMT+08:00 3922 endDate: Thu Jan 26 23:59:59 GMT+08:00 3922 staffId: 10164开始日期:1 月 25 日星期三 00:00:00 GMT+08:00 3922 结束日期:1 月 26 日星期四 23:59:59 GMT+08:00 3922 员工 ID:10164
But if I convert my dates that I get from the datepicker to epoch like this:但是,如果我将从 datepicker 获得的日期转换为这样的纪元:
if (hasSelectedStartDate && hasSelectedStaffId) {
Long lStartDate = startDate.getTime();
Long lEndDate = endDate.getTime();
viewModel.getTransactions(lStartDate, lEndDate, selectedStaffId);
//viewModel.getTransactions(startDate, endDate, selectedStaffId);
//setupTransactionList();
}
I've noticed that in my database, the date is 16431... But when I query and I convert my date parameters, it is 6060....我注意到在我的数据库中,日期是 16431...但是当我查询并转换我的日期参数时,它是 6060...。
How do I make this right?我怎样才能做到这一点? Thank you.
谢谢你。
The mistake I had was in the codes of my onClick(View...).我的错误在于我的 onClick(View...) 的代码。 I just converted my Date Pickers to Calendar and got the time from it like so..
我刚刚将我的日期选择器转换为日历并从中获取时间。
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;
}
}
The endDate = new Date(year, monthOfYear, dayOfMonth, 23, 59, 59);
endDate = new Date(year, monthOfYear, dayOfMonth, 23, 59, 59);
had a different format so since I was using the "Calendar" instance when saving, I figured that it should have been a "Calendar" instance that I should be passing as parameters.具有不同的格式,因此由于我在保存时使用了“日历”实例,因此我认为它应该是一个“日历”实例,我应该将其作为参数传递。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.