繁体   English   中英

如何按日期搜索房间数据库?

[英]How to search by date Room Database?

我在房间数据库 Android Studio 中有一个数据库,我需要在其中找到与通过 http 查询找到的日期匹配的记录

我看到的问题是,由于我在尝试使用“LIKE”或“=”进行查询时使用了数据转换器(ZoneDateTimeConverter),因此它返回 null object ......我该如何进行查询?

查询一:

@Query("select * from Operation where date =:arg0")
Operation getOperationConsult(String arg0);

查询 2:

@Query("select * from Operation where date LIKE :arg0")
Operation getOperationConsult(String arg0);

经营单位日期:

    @ColumnInfo(name = "date")
ZonedDateTime date;

转换器:

public class ZonedDateTimeTypeConverter {

@TypeConverter
public static ZonedDateTime toZonedDateTime(Long value) {
    return value == null ? null : ZonedDateTime.ofInstant(Instant.ofEpochMilli(value), ZoneOffset.UTC);
}

@TypeConverter
public static Long toString(ZonedDateTime value) {
    return value == null ? null : value.toInstant().toEpochMilli();
}

}

简而言之,您需要对同类进行比较,并且数据的存储时间可以低至几毫秒。

所以你可以: -

@Query("SELECT * FROM operation WHERE date=:arg0")
List<Operation> getOperationConsult(long arg0);

可以通过使用您为 Room 提供的 TypeConverter 将 ZonedDateTime 转换为 long 来确定 long 的位置(稍后会详细介绍)。

但是,您正在处理毫秒,因此由于高精度,上述查询可能根本没有用。

也许考虑以下几点:-

@Query("SELECT * FROM operation WHERE date / (1000 * 60 * 60 * 24)= (:arg0 / (1000 * 60 * 60 * 24))")
List<Operation> getOperationsConsultPerDate(long arg0);

这会去掉时间(毫秒、秒、分钟和小时),只留下日期(对于参数的两边),因此将检索与传递的 long 具有相同日期的所有操作。

要确定 long 那么这可以使用 ZDT 然后使用toString TypeConverter 来实现。

考虑以下工作示例,它使用您的操作实体(至少是日期列)和上述 dao(为了简洁和方便而在主线程上运行):-

public class MainActivity extends AppCompatActivity {

    private final static String TAG = "DBINFO";

    TheDatabase db;
    AllDao dao;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        db = TheDatabase.getInstance(this);
        dao = db.getAllDao();

        /* Add some data */
        for (int i=0;i<48;i++) {
            ZonedDateTime zdt = ZonedDateTime.now().minusHours(i).plusHours(24);
            dao.insert(new Operation(zdt));
        }

        /* extract Operations based upon the current time */
        logOperations(dao.getOperationConsult(ZonedDateTimeTypeConverter.toString(ZonedDateTime.now())));
        logOperations(dao.getOperationsConsultPerDate(ZonedDateTimeTypeConverter.toString(ZonedDateTime.now())));
    }

    void logOperations(List<Operation> operationList) {
        for(Operation o: operationList) {
            Log.d(TAG,"Operation ID is " + o.id + " date is " + o.date.toString());
        }
    }
}

运行上述结果: -

  1. 由于精度因素,第一个查询未提取任何内容。
  2. 以下来自第二个查询

:-

2021-12-15 10:49:16.451 D/DBINFOEXAMPLE2: Operation ID is 25 date is 2021-12-14T23:49:16.398Z
2021-12-15 10:49:16.451 D/DBINFOEXAMPLE2: Operation ID is 26 date is 2021-12-14T22:49:16.400Z
2021-12-15 10:49:16.452 D/DBINFOEXAMPLE2: Operation ID is 27 date is 2021-12-14T21:49:16.401Z
2021-12-15 10:49:16.452 D/DBINFOEXAMPLE2: Operation ID is 28 date is 2021-12-14T20:49:16.403Z
2021-12-15 10:49:16.452 D/DBINFOEXAMPLE2: Operation ID is 29 date is 2021-12-14T19:49:16.404Z
2021-12-15 10:49:16.452 D/DBINFOEXAMPLE2: Operation ID is 30 date is 2021-12-14T18:49:16.407Z
2021-12-15 10:49:16.452 D/DBINFOEXAMPLE2: Operation ID is 31 date is 2021-12-14T17:49:16.408Z
2021-12-15 10:49:16.453 D/DBINFOEXAMPLE2: Operation ID is 32 date is 2021-12-14T16:49:16.410Z
2021-12-15 10:49:16.453 D/DBINFOEXAMPLE2: Operation ID is 33 date is 2021-12-14T15:49:16.412Z
2021-12-15 10:49:16.453 D/DBINFOEXAMPLE2: Operation ID is 34 date is 2021-12-14T14:49:16.414Z
2021-12-15 10:49:16.453 D/DBINFOEXAMPLE2: Operation ID is 35 date is 2021-12-14T13:49:16.416Z
2021-12-15 10:49:16.453 D/DBINFOEXAMPLE2: Operation ID is 36 date is 2021-12-14T12:49:16.417Z
2021-12-15 10:49:16.454 D/DBINFOEXAMPLE2: Operation ID is 37 date is 2021-12-14T11:49:16.420Z
2021-12-15 10:49:16.454 D/DBINFOEXAMPLE2: Operation ID is 38 date is 2021-12-14T10:49:16.422Z
2021-12-15 10:49:16.454 D/DBINFOEXAMPLE2: Operation ID is 39 date is 2021-12-14T09:49:16.424Z
2021-12-15 10:49:16.454 D/DBINFOEXAMPLE2: Operation ID is 40 date is 2021-12-14T08:49:16.426Z
2021-12-15 10:49:16.454 D/DBINFOEXAMPLE2: Operation ID is 41 date is 2021-12-14T07:49:16.427Z
2021-12-15 10:49:16.454 D/DBINFOEXAMPLE2: Operation ID is 42 date is 2021-12-14T06:49:16.430Z
2021-12-15 10:49:16.454 D/DBINFOEXAMPLE2: Operation ID is 43 date is 2021-12-14T05:49:16.432Z
2021-12-15 10:49:16.455 D/DBINFOEXAMPLE2: Operation ID is 44 date is 2021-12-14T04:49:16.434Z
2021-12-15 10:49:16.455 D/DBINFOEXAMPLE2: Operation ID is 45 date is 2021-12-14T03:49:16.435Z
2021-12-15 10:49:16.455 D/DBINFOEXAMPLE2: Operation ID is 46 date is 2021-12-14T02:49:16.436Z
2021-12-15 10:49:16.455 D/DBINFOEXAMPLE2: Operation ID is 47 date is 2021-12-14T01:49:16.438Z
2021-12-15 10:49:16.455 D/DBINFOEXAMPLE2: Operation ID is 48 date is 2021-12-14T00:49:16.439Z

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM