近期有个需求是需要通过rowid的方式降序查询所有的结果,具体的SQL语句是这样的
select * from tbl_mail_recent_list order by rowid desc
rowid作为sqlite里面相对特殊的属性,是可以直接使用的,但是对于wcdb的WINQ语法那就麻烦了,于是在wcdb的GitHub的demo翻个遍没找到相应的用例,只好自己想思路了:
- wcdb是否提供rowid字段?
- oder方法如何自定义?
第一个问题简单,wcdb是开源的,自己搜索一下字段发现wcdb是提供相关属性的,
class Column : public Describable {
public:
...
static const Column Rowid;
...
};
有了这个属性如何使用呢,第二个问题就是要看下Oder是怎么封装到WINQ里面的,查询条件里面携带oderdy的方法里面需要传入一个WCTOrderByList
对象,抽丝剥茧看到这个list需要传入什么对象
typedef WCDB::OrderList WCTOrderByList;
typedef std::list<const Order> OrderList;
可以看到传入的对象就是Oder对象了,那就顺势看下Oder对象的定义,发现两个构造函数,第二个构造函数简单,只需要两个参数,第一个就是statement,第二个就是OrderTerm枚举:{ASC和DESC},离成功只差一步了,哈哈~
class Order : public Describable {
public:
Order(const Expr &expr, const std::string &collation, OrderTerm term = OrderTerm::NotSet);
Order(const Expr &expr, OrderTerm term = OrderTerm::NotSet);
operator OrderList() const;
};
最后编写出来的结果是:
WCTOrderBy wctOrder = WCDB::Order(WCTExpr(WCDB::Column::Rowid), WCDB::OrderTerm::DESC);
WCTColumnsXRows *resultRows = [database getRowsOnResults:{CMailRecentList.name, CMailRecentList.address} fromTable:kTbl_RecentList where:expr orderBy:{wctOrder} limit:limit];
Enjoy!