有没有办法用greenDao按相关表中的字段排序?例如,我有一张汽车表和一张司机表。每辆车都有一名司机。现在我想查询(例如蓝色)汽车并按司机姓名排序
问问题
5561 次
4 回答
5
在 QueryBuilder 中,有一些方法可以指定排序顺序。查找以“order...”开头的方法,例如 orderAsc(Property)。
于 2013-04-18T13:45:10.840 回答
5
我现在也在玩 GreenDao,希望我对第一个答案中的评论和greenDao 文档的查询部分中的描述有所帮助。
以下代码段应该可以工作(没有测试它:)):
Query query = carsDao.queryRawCreate( ", driver D WHERE T.COLOR='blue' AND T.DRIVER_ID=D._ID ORDER BY D.NAME ASC");
这在内部创建了一个与此类似的 SQL:
SELECT T.'id', T.'name', T.'color', T.'driver_id'
FROM cars T, driver D
WHERE T.COLOR='blue'
AND T.DRIVER_ID=D._ID
ORDER BY D.NAME ASC
该语句的第一部分是由 queryRawCreate 方法为您创建的,其余部分是传递给的自定义 sql 语句queryRawCreate
。
如果您想知道 JOIN 语句在哪里,请参阅此问题。
于 2013-04-18T22:27:32.903 回答
2
您可以将 QueryBuilders 与 Greendao ORM 生成的(数据访问对象)DAO 一起使用。
使用前定义(在活动中)
ProductDao productDao;
DaoSession daoSession;
您应该将 DaoMaster 和 DaoSession 放在您的应用程序范围内。在扩展 Application 的类的 onCreate() 内部。
DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(getApplicationContext(), "app-db", null);
SQLiteDatabase db = helper.getWritableDatabase();
daoSession = new DaoMaster(db).newSession();
使用前初始化
daoSession = ((MyApplication) getApplication()).getDaoSession();
productDao = daoSession.getProductDao();
您可以像这样对结果进行排序以显示在活动中。
private void refreshProducts() {
switch (sorted_by){
case SORT_BY_DATE:
cardItems = productDao.queryBuilder().orderAsc(ProductDao.Properties.Id).list();
setupRecyclerView();
break;
case SORT_BY_PRICE:
cardItems = productDao.queryBuilder().orderDesc(ProductDao.Properties.Price).list();
setupRecyclerView();
break;
case SORT_BY_POPULARITY:
cardItems = productDao.queryBuilder().orderDesc(ProductDao.Properties.Name).list();
setupRecyclerView();
break;
}
}
于 2017-01-25T15:08:27.790 回答
0
使用 QueryBuilder.orderRaw() 和 Join.getTablePrefix() 的简单解决方案
我的示例代码:
QueryBuilder.LOG_SQL = true;//Enable to see SQL result
QueryBuilder<Item> query = daoSession.queryBuilder(Item.class);
Join itemWithCollection = query.join(JoinItemWithCollection.class,
JoinItemWithCollectionDao.Properties.ItemId);
String joinedTable = itemWithCollection.getTablePrefix();
Join collection = query.join(itemWithCollection, JoinItemWithCollectionDao.Properties.CollectionId,
Collection.class, CollectionDao.Properties.Id);
String orderCol = JoinItemWithCollectionDao.Properties.SomeOrderCol.columnName;
collection.where(CollectionDao.Properties.Key.eq(collectionId));
query.orderRaw(joinedTable+".\""+orderCol+"\" DESC");
query.limit(limit);
query.offset(from);
List<Item> results = query.list();
于 2019-09-06T07:53:00.477 回答