ORMLite选择的不同字段(ORMLite Select Distinct Fields)

2019-06-27 14:03发布

我有一个具有众多领域一个SQLite表(在Android),但某些字段重复/非规范化。 我想选择一组不同的这些数据,并利用它们为实际的对象。

书表

title            summary        author
Little Johnny    A funny kid    Johnny Himself
Big Johnny       A funny adult  Johnny Himself

我想从这个列表(“约翰尼自己”)中提取一个作者和期望,我应该能够手动ORMLite要做到这一点,而不是使用Java。

Answer 1:

我想选择一组不同的这些数据,并利用它们为实际的对象。

我敢肯定不是100%我明白您的查询在这里,但ORMLite支持distinct()方法的QueryBuilder应该做你想做的。 所以,你的代码看起来是这样的:

List<Book> results = booksDao.queryBuilder()
    .distinct().selectColumns("author").query();

在这种情况下,所产生的Book对象将只拥有author字段集,而不是id字段或其他任何东西。 如果你只是想作者姓名,而不是对象,那么你可以这样做:

GenericRawResults<String[]> rawResults =
    booksDao.queryRaw("SELECT DISTINCT author FROM books");
for (String[] resultColumns : rawResults) {
    String author = resultColumns[0];
    ...
}


Answer 2:

这是我的应用程序代码

public class DbHelper<T> {
    private Class<T> c;
    private DatabaseHelper db;
    public DbHelper(Class<T> c) {
        this.c = c;
        db = DatabaseHelper.getInstance();
    }

这是一个好主意

public List<T> queryForBuilderDistinct(int offset, int limit, String ColumnsName,
       String orderName, boolean isAsc) {
    try {
        Dao<T, Integer> dao = db.getDao(c);
        QueryBuilder<T, Integer> queryBuilder = dao.queryBuilder();
        if (offset != 0) {
            queryBuilder.offset((long) offset);
        }
        if (limit != 0) {
            queryBuilder.limit((long) limit);
        }
        if (orderName != null) {
            queryBuilder.orderBy(orderName, isAsc);
        }
        queryBuilder.distinct().selectColumns(ColumnsName);
        return dao.query(queryBuilder.prepare());
    } catch (SQLException e) {
        LogUtil.e(TAG, "queryForBuilderDistinct", e);
    }
    return new ArrayList<T>();
}


文章来源: ORMLite Select Distinct Fields