RTDatabase(2) SQL篇
2018-07-03 本文已影响0人
__ENUUI
开发中涉及到字符串时,总有让人头疼的时候。毕竟字符串没有智能提示,只能硬码或者copy。也出现过特别难debug的问题。
操作 sqlite3
时,无可避免的要编辑很多字符串,增加了字符串出错的风险。
RTDatabase
尝试降低操作 sql 字符串时的风险,使用链式编程给出了一种解决方案。
- gitHub 源码:RTDatabase
- 为什么采用链式?
具体实现方式请参考Object-C OC 实现链式调用。
以查询表为例子。
// 假设数据库中有名为 Person 的一张表,表中包含名为 age 和 gender 的 column。
NSString *selectSql = @"SELECT age, gender FROM Person where age = 18 and gender = male";
可以将 selectSql
分为 SELECT
、age, gender
、FROM Person
、where age = 18 and gender = male
四段。除去SELECT
其他三段在查询操作中都是可变的。
如果是在swift
中完全可以写成:
"SELECT" + " age, gender" + " FROM" + " Person" + " WHERE" + " age = 18" + " and" + "gender = male"
而且可以将SQLite的命令字符串写成常量,最多是注意下空格的问题。
但是在OC中,没有这样便捷的 +
语法来处理字符串。所以这种先拆分,后顺序拼接组装的操作,选择链式的理由还是充分的。
- 用法
源码都在RTDatabase中的以PP开头的文件中。
- (PPSQL *(^)(NSString *))CREATE;
- (PPSQL *(^)(NSString *))INSERT;
- (PPSQL *(^)(NSString *))UPDATE;
- (PPSQL *(^)(NSString *))DELETE;
- (PPSQL *)SELECT;
首先需要选择主句,RTDatabase
提供了建表,插入,更新,删除,查询五中主句。
- (PPSQL *(^)(PPSQLSubBlock))subs;
- (PPSQL *(^)(PPSQLTermBlock))terms;
并且视子句需求,选择调用subs
或者terms
。
subs
主要在需要column
相关限定的时候调用,比如selectSql
中跟在 SELECT
后的表示查询目标 column 的age, gender
。
terms
则是在like、GLOB、group By、Limit、Order By、Where
时调用。
PPSQL *pp = [[PPSQL alloc] init];
NSString *sql = pp.SELECT.subs(^(id<PPSQLProtocol> sub) {
sub.column(@"age").column(@"gender").from(@"Person");
}).terms(^(PPTerm *term) {
term.where.equal(@"age", @(18)).equal(@"gender", @"male");
}).build;
-> sql = @"SELECT age, gender FROM Person where age = 18 and gender = male";