近期有个需求是需要通过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!