(2)预期+思考【利用objective-c的runtime特性,结合FMDB实现轻量级的ORM】

版权声明:本文为博主原创文章,未经博主允许不得转载。

本次利用一个常见的数据库关系例子说明本ORM的基本需求。

  班级、学生 这一对表,关系为1对多,班级表主键id,学生表主键num、外键班级id。

  表结构如下:

班级表class结构

学生student表:

程序中对应的实体类分别是:班级实体(ClassEntity),学生实体(Student)

其基本objective-c类结构如下:

@interface ClassEntity : NSObject

@property (nonatomic,assign)NSInteger classId;
@property (nonatomic,copy)NSString* className;

@end
@interface StudentEntity : NSObject 
@property (nonatomic,assign)NSInteger classId;
@property (nonatomic,assign)int age;
@property (nonatomic,assign)float score;

@property (nonatomic,assign)NSInteger studentNum;
@property (nonatomic,copy)NSString* studentName;
@end

0、实体类-->建库建表语句

在这个orm中,我预期的效果是:

0、如果存在内置的数据库,我只需要传入实体类,就能建立映射,直接操作。

1、如果不存在内置数据库,我只需要传入实体类,就能自动建好数据库和实体数据库间的映射。

2、支持主外键,支持索引语句。

input:

 @[ [ClassEntity class],[StudentEntity class]]

output:

CREATE TABLE class (
  id integer PRIMARY KEY AUTOINCREMENT NOT NULL,
  name text NOT NULL DEFAULT(‘Software01‘)
);

【数据库的表名可以任意配置,学生表名可以为StudentEntity】

 CREATE TABLE ‘StudentEntity‘ (
  ‘num‘  INTEGER  PRIMARY KEY   NOT NULL , 
 ‘age‘  INTEGER   NOT NULL   DEFAULT ‘18‘  ,
 ‘name‘  TEXT   NOT NULL   DEFAULT ‘blockcheng‘  ,
 ‘score‘  REAL   NOT NULL   DEFAULT ‘80.0‘  , 
 ‘classid‘  INTEGER,  CONSTRAINT ‘Student_class‘ FOREIGN KEY (‘classid‘)  REFERENCES ‘class‘(‘id‘)
 );
 CREATE INDEX idx_StudentEntity_num ON StudentEntity (num);

1、实体类对象---->insert 语句

此条的预期是这样的: 传入一个实体对象,自动生成sql,然后经由fmdb,存入sqlite。

input:

        ClassEntity* classeEntity = [ClassEntity new];
        classeEntity.className = @"Software02";
        classeEntity.classId = 2;
        StudentEntity* student = [StudentEntity new];
        student.age = 12;
        student.score = 80;
        student.classId = 2;
        student.studentNum = 421125;
        student.studentName = @"BlockCheng";

output:

 INSERT INTO class ( ‘id‘,‘name‘) VALUES (:id ,:name ) 
 
 args:{
    id = 2;
    name = "Software02";
}
INSERT INTO StudentEntity ( ‘age‘,‘name‘,‘num‘,‘score‘,‘classid‘) VALUES (:age ,:name ,:num ,:score ,:classid ) 
 
args:{
    age = 12;
    classid = 2;
    name = "BlockCheng";
    num = 421125;
    score = 80;
}

2、实体类对象----->update语句,基于主键

传入一个sqlite中已存在的实体,自动生成update语句,基于主键的条件更新。

input:

        StudentEntity* student = [StudentEntity new];
        student.age = 12;
        student.score = 80;
        student.classId = 2;
        student.studentNum = 421125;
        student.studentName = @"BlockCheng_update";

output:

UPDATE StudentEntity SET age = :age,name = :name,num = :num,score = :score,classid = :classid  WHERE num =‘421225‘ 
 
args:{
    age = 12;
    classid = 2;
    name = "BlockCheng_update";
    num = 421225;
    score = 80;
}

3、查询条件----->select语句--->实体类对象

根据传入的查询条件,生成sql:

input:

        .entityClass = [StudentEntity class];
        .propertyArray = @[@"age",@"classId",@"score",@"studentName",@"studentNum"];
        .selection = @"classId = ? and studentNum=?";
        .selectionArgs = @[@1,@421128];
        .orderBy = @" studentNum  asc";

output:

 SELECT  age,  classid,  score,  name,  num  FROM StudentEntity  WHERE classid = ? and num=?  ORDER BY  num  asc  
 
 arg:(
    1,
    421128
)

4、实体类+条件---->delete语句

根据传入的类和条件,生成delete语句。

input:

        .entityClass = [StudentEntity class];
        .selection = @"studentNum=?";
        .selectionArgs = @[@421138];

output:

DELETE FROM StudentEntity   WHERE num =‘421138‘

5、指定条件+实体类---->update、delete

update input:

        .entityClass = [StudentEntity class];
        .selection = @"studentNum=?";
        .selectionArgs = @[@421128];
        .update= @"studentName=?"
        [email protected][@"update_condition"];

update output:

 UPDATE StudentEntity SET  name=?  WHERE num=? 
  
 args:(
    "update_condition",
    421125
)

delete input:

        .entityClass = [StudentEntity class];
        .selection = @"studentNum < ?";
        .selectionArgs = @[@421135];

delete output:

 DELETE  FROM StudentEntity   WHERE num < ?  
 
 args:(
    421135
)

6、思考

如何利用runtime+fmdb,实现上面提到的效果?

0、怎么去抽象和封装,达到满足需求的基本结构类,便于日后使用?

1、怎么明了地处理实体和数据库表间的映射关系,简单易用的语法如何设计?

3、到底该提供哪些基础通用功能?

时间: 2024-11-05 12:12:49

(2)预期+思考【利用objective-c的runtime特性,结合FMDB实现轻量级的ORM】的相关文章

(3)实体和结构【利用objective-c的runtime特性,结合FMDB实现轻量级的ORM】

版权声明:本文为博主原创文章,未经博主允许不得转载. 0.本ORM中需要的角色 根据前面提出的预期需求和思考,本ORM中至少得有这么这么几个角色实体: 整体而言,负责数据库表和实体的映射协议[BCORMEntityProtocol] 本ORM支持的数据类型实体,如TEXT,INT...[BCSqliteType] 字段约束实体,是否主外键等[BCConstraints] 外键参考实体,实体间关系[BCReference] 操作条件封装实体[BCSqlParameter] 操作主入口,orm门面[

(4)代码及测试【利用objective-c的runtime特性,结合FMDB实现轻量级的ORM】

0.测试代码及结果 1.用法_建表_映射 2.insert实体到sqlite 3.update更新实体 4.query查询一个或多个 5.delete删除实体 6.基于条件的更新和删除 7.结束语

刨根问底Objective-C Runtime

http://chun.tips/blog/2014/11/05/bao-gen-wen-di-objective%5Bnil%5Dc-runtime-(2)%5Bnil%5D-object-and-class-and-meta-class/ 刨根问底Objective-C Runtime(1)- Self & Super 刨根问底Objective-C Runtime(2)- Object & Class & Meta Class 刨根问底Objective-C Runtime(

刨根问底Objective-C Runtime(2)- Object &amp; Class &amp; Meta Class

Chun Tips 专注iOS开发 刨根问底Objective-C Runtime(2)- Object & Class & Meta Class 上一篇笔记讲述了objc runtime中Self 和 Super的细节,本篇笔记主要是讲述objc runtime中关于Object & Class & Meta Class的细节. 习题内容 下面代码的运行结果是? @interface Sark : NSObject @end @implementation Sark @e

刨根问底Objective-C Runtime(1)- Self &amp; Super

刨根问底Objective-C Runtime(1)- Self & Super - Chun Tips Chun Tips 专注iOS开发 刨根问底Objective-C Runtime(1)- Self & Super 前言 关于Objective-C Runtime一篇好的文档 : Understanding the Objective-C Runtime 译文地址为: http://blog.cocoabit.com/blog/2014/10/06/yi-li-jieobjecti

刨根问底Objective-C Runtime(4)- 成员变量与属性

http://chun.tips/blog/2014/11/08/bao-gen-wen-di-objective[nil]c-runtime(4)[nil]-cheng-yuan-bian-liang-yu-shu-xing/ 上一篇笔记讲述了objc runtime中消息和Category的细节,本篇笔记主要是讲述objc runtime的 成员变量和属性. 习题内容 下面代码会? Compile Error / Runtime Crash / NSLog…? @interface Sark

iOS开发——语法OC篇&amp;Objective-C新特性的总结

Objective-C新特性的总结 1.nonnull nonnull : 标示当前属性不为空,让外界放心用,只做标示用,即使为空,也木有办法    相当于swift里面的 ! 号 @property (nonnull, nonatomic, strong) NSString *name; 2.nullablenullable : 标示当前属性可能为空,让外界使用时注意    相当于swift里面的 ? 号 @property (nullable, nonatomic, strong) NSSt

利用flashback transaction query新特性进行事务撤销

具备了flashback version query查询的基础,我们就可以进行基于flashback version query的恢复.这就是flashback transaction query.flashback transaction query可以从FLASHBACK_TRANSACTION_QUERY中获得指定事务的历史信息以及Undo_SQL,通过这个UNDO_SQL,我们就可以恢复特定的事务.Flashback transaction query需要用到FLASHBACK_TRAN

iOS完全自学手册——[三]Objective-C语言速成,利用Objective-C创建自己的对象

1.前言 上一篇已经介绍了App Delegate.View Controller的基本概念,除此之外,分别利用storyboard和纯代码创建了第一个Xcode的工程,并对不同方式搭建项目进行了比较.这一篇文章,我准备为大家介绍一下奇葩的Objective-C语言的语法和使用.这篇文章主要讲Objective-C的理论概念. 2.学习目标 2.1 Objective-C语言面向对象的特性与其他语言(C++)类比学习,声明定义一个MyObject类,并创建这个类的实例. 2.2 Objectiv