RTDatabase(2) SQL篇

2018-07-03  本文已影响0人  __ENUUI

RTDatabase(1) 存储篇

开发中涉及到字符串时,总有让人头疼的时候。毕竟字符串没有智能提示,只能硬码或者copy。也出现过特别难debug的问题。
操作 sqlite3 时,无可避免的要编辑很多字符串,增加了字符串出错的风险。
RTDatabase 尝试降低操作 sql 字符串时的风险,使用链式编程给出了一种解决方案。

  1. 为什么采用链式?
    具体实现方式请参考Object-C OC 实现链式调用
    以查询表为例子。
// 假设数据库中有名为 Person 的一张表,表中包含名为 age 和 gender 的 column。
NSString *selectSql = @"SELECT age, gender FROM Person where age = 18 and gender = male";

可以将 selectSql分为 SELECTage, genderFROM Personwhere age = 18 and gender = male四段。除去SELECT其他三段在查询操作中都是可变的。
如果是在swift中完全可以写成:

"SELECT" + " age, gender" + " FROM" + " Person" + " WHERE" + " age = 18" + " and" + "gender = male"

而且可以将SQLite的命令字符串写成常量,最多是注意下空格的问题。
但是在OC中,没有这样便捷的 +语法来处理字符串。所以这种先拆分,后顺序拼接组装的操作,选择链式的理由还是充分的。

  1. 用法
    源码都在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";
上一篇下一篇

猜你喜欢

热点阅读