美文网首页
RTDatabase(2) SQL篇

RTDatabase(2) SQL篇

作者: __ENUUI | 来源:发表于2018-07-03 18:46 被阅读0次

    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";
    

    相关文章

      网友评论

          本文标题:RTDatabase(2) SQL篇

          本文链接:https://www.haomeiwen.com/subject/rxyjuftx.html