如何使用OrmLite从SQLite数据库中选择唯一的月 - 年组合?

时间:2015-10-08 08:51:00

标签: android sql sqlite

我有一个包含数据的表,并且有一个带有日期值的列。

Table A
table_id     date

因此,请将表视为拥有超过数千个行和条目。我想要做的是从表中选择所有不同的月份和年份,因此输出可能看起来像这样:

09  2013  09-2013
12  2014  12-2014
01  2015  01-2015
03  2015  03-2015
05  2015  05-2015

也许是这样的?如果可以的话?

dao.queryBuilder().distinct().selectColumns("strftime('%mm-%yyyy', date)").query();

但我似乎无法以我想要的方式完成上述工作。我的模型还使用DataType.DATE字段上的date

有什么方法可以使用OrmLite的distinct()方法返回这种列表吗?任何帮助将不胜感激!谢谢!

2 个答案:

答案 0 :(得分:1)

SqlFiddleDemo

CREATE TABLE TableA(table_id INT, `date` DATE);

INSERT INTO TableA
VALUES (1, '2014-01-21'), (2, '2014-01-23'),
 (3, '2015-01-21'), (4, '2015-01-01'), (5, '2014-07-21'), (6, '2012-01-01');

SELECT DISTINCT
  STRFTIME('%m-%Y', t.`date`) AS Output
FROM TableA t
ORDER BY t.`date`;

我不知道OrmLite但我希望您能够转换此解决方案,或者只是将纯SQL用于您的ORM。

修改

SELECT DISTINCT
    STRFTIME('%m', t.`date`) AS Month,
    STRFTIME('%Y', t.`date`) AS `Year`,
    STRFTIME('%m-%Y', t.`date`) AS Output
FROM TableA t
ORDER BY t.`date`;

答案 1 :(得分:1)

为了确保我们正在谈论同样的事情:ORMLite是一个“对象关系映射精简版(ORM Lite)提供了一些简单,轻量级的功能,用于将Java对象持久化到SQL数据库[...]。”

它不仅仅是一些SQL原始查询的包装器:它提供了一种创建模型(一些POJO)的方法,这些模型将持久存储在数据库中,而不必处理SQL约束和强大的知识。您将能够使用普通Java对象存储对象并检索它们。

selectColumns(String)方法将列名作为参数。您正在传递原始SQL语句。

如果你阅读了这个方法的源代码,你就有了这个:

public QueryBuilder<T, ID> selectColumns(String... columns) {
    for (String column : columns) {
        addSelectColumnToList(column);
    }
    return this;
}

然后

private void addSelectColumnToList(String columnName) {
    verifyColumnName(columnName);
    addSelectToList(ColumnNameOrRawSql.withColumnName(columnName));
}

并完成:

/**
 * Verify the columnName is valid and return its FieldType.
 * 
 * @throws IllegalArgumentException
 *             if the column name is not valid.
 */
protected FieldType verifyColumnName(String columnName) {
    return tableInfo.getFieldTypeByColumnName(columnName);
}

因此,通过内省,ORMLite将尝试在模型的字段中查找给定的列名称。你的字符串显然不是列名:)

此外,对于更“概念”的问题:我认为您不应该从您的请求中转换日期格式。实际上,ORMLite负责在您的数据库中保留模型。他的目的不是为了正确格式化数据以进行处理或显示。如果在数据库中保存数据后需要将其显示为另一个数据库,则必须在此时制作“解析内容”,而不是之前。

总结一下:

  • 使用date字段
  • 的真实列名称
  • 继续按照您的方式使用distinct()
  • 解析数据以便在需要时正确显示(让ORMLite选择存储和加载方式)

<强>来源

http://ormlite.com/javadoc/ormlite-core/doc-files/ormlite_3.html#QueryBuilder-Capabilities

https://github.com/j256/ormlite-core/blob/master/src/main/java/com/j256/ormlite/stmt/QueryBuilder.java

https://github.com/j256/ormlite-core/blob/master/src/main/java/com/j256/ormlite/stmt/StatementBuilder.java