Mojo-database是我个人比较喜欢多开源项目,下文是该项目打介绍和地址:
mojo-database
简介:
MojoDatabase is an ActiveRecord-like ORM for SQLite written in Objective-C for use in iOS applications.

The goal is to provide a nicer user interface for using SQLite with Objective-C applications via the ActiveRecord pattern.

下面,我将介绍一下mojo的对象映射机制。下面的代码就是model执行findsql是运
行的代码

NSArray *results = [database executeSql:sql
withParameters:parameters withClassForRow:[self class]];

从代码的[self class]就是把自己的类传递过去,

withParameters:(NSArray *)parameters
withClassForRow:(Class )rowClass

在execute函数中,有如下代码。

      if (needsToFetchColumnTypesAndNames) {
columnTypes = [self columnTypesForStatement:statement];
columnNames = [self columnNamesForStatement:statement];
needsToFetchColumnTypesAndNames = NO;
} id row = [[rowClass alloc] init];
[self copyValuesFromStatement:statement
toRow:row queryInfo:queryInfo
columnTypes:columnTypes columnNames:columnNames];
[rows addObject:row];
}

其中id row = [[rowClass alloc] init];动态创建对象了,其中sqlite支持的类型有

-(int)columnTypeToInt:(NSString *)columnType {
if ([columnType isEqualToString:@"INTEGER"]) {
return SQLITE_INTEGER;
} else if ([columnType isEqualToString:@"REAL"]) {
return SQLITE_FLOAT;
} else if ([columnType isEqualToString:@"TEXT"]) {
return SQLITE_TEXT;
} else if ([columnType isEqualToString:@"BLOB"]) {
return SQLITE_BLOB;
} else if ([columnType isEqualToString:@"NULL"]) {
return SQLITE_NULL;
}
return SQLITE_TEXT;
}

提取数值的代码

-(id)valueFromStatement:(sqlite3_stmt *)statement
column:(int)column queryInfo:(NSDictionary *)queryInfo columnTypes:(NSArray *)columnTypes
{
int columnType = [[columnTypes objectAtIndex:column] intValue]; /*
* force conversion to the declared type using sql conversions; this saves
* some problems with NSNull being assigned to non-object values
*/
if (columnType == SQLITE_INTEGER) {
return [NSNumber numberWithInt:sqlite3_column_int(statement, column)];
} else if (columnType == SQLITE_FLOAT) {
return [NSNumber numberWithDouble:sqlite3_column_double(statement, column)];
} else if (columnType == SQLITE_TEXT) {
const char* text = (const char *) sqlite3_column_text(statement, column);
if (text != nil) {
return [NSString stringWithUTF8String:text];
} else {
return @"";
}
} else if (columnType == SQLITE_BLOB) {
// create an NSData object with the same size as the blob
return [NSData dataWithBytes:sqlite3_column_blob(statement, column) length:sqlite3_column_bytes(statement, column)];
} else if (columnType == SQLITE_NULL) {
return nil;
} NSLog(@"Unrecognized SQL column type: %i for sql %@", columnType, [queryInfo objectForKey:@"sql"]);
return nil;
}

设置对象属性的代码

      [row setValue:value forKey:[columnNames objectAtIndex:i]];
}

MojoDatabase 源码学习之对象映射的更多相关文章

  1. Spring源码学习

    Spring源码学习--ClassPathXmlApplicationContext(一) spring源码学习--FileSystemXmlApplicationContext(二) spring源 ...

  2. Vue源码学习二 ———— Vue原型对象包装

    Vue原型对象的包装 在Vue官网直接通过 script 标签导入的 Vue包是 umd模块的形式.在使用前都通过 new Vue({}).记录一下 Vue构造函数的包装. 在 src/core/in ...

  3. Java集合专题总结(1):HashMap 和 HashTable 源码学习和面试总结

    2017年的秋招彻底结束了,感觉Java上面的最常见的集合相关的问题就是hash--系列和一些常用并发集合和队列,堆等结合算法一起考察,不完全统计,本人经历:先后百度.唯品会.58同城.新浪微博.趣分 ...

  4. MVC系列——MVC源码学习:打造自己的MVC框架(四:了解神奇的视图引擎)

    前言:通过之前的三篇介绍,我们基本上完成了从请求发出到路由匹配.再到控制器的激活,再到Action的执行这些个过程.今天还是趁热打铁,将我们的View也来完善下,也让整个系列相对完整,博主不希望烂尾. ...

  5. MVC系列——MVC源码学习:打造自己的MVC框架(一:核心原理)

    前言:最近一段时间在学习MVC源码,说实话,研读源码真是一个痛苦的过程,好多晦涩的语法搞得人晕晕乎乎.这两天算是理解了一小部分,这里先记录下来,也给需要的园友一个参考,奈何博主技术有限,如有理解不妥之 ...

  6. hashMap源码学习记录

    hashMap作为java开发面试最常考的一个题目之一,有必要花时间去阅读源码,了解底层实现原理. 首先,让我们看看hashMap这个类有哪些属性 // hashMap初始数组容量 static fi ...

  7. Spring源码学习-容器BeanFactory(四) BeanDefinition的创建-自定义标签的解析.md

    写在前面 上文Spring源码学习-容器BeanFactory(三) BeanDefinition的创建-解析Spring的默认标签对Spring默认标签的解析做了详解,在xml元素的解析中,Spri ...

  8. Underscore.js 源码学习笔记(上)

    版本 Underscore.js 1.9.1 一共 1693 行.注释我就删了,太长了… 整体是一个 (function() {...}());  这样的东西,我们应该知道这是一个 IIFE(立即执行 ...

  9. mongo源码学习(三)请求接收传输层

    在上一篇博客中(mongo源码学习(二)db.cpp之mongoDbMain方法分析),我们把db.cpp中的mongoDbMain的执行过程分析了一下,最后会调用initAndListen(serv ...

随机推荐

  1. The service cannot be activated because it does not support ASP.NET compatibility

    刚刚在ASP.NET创建一个Service,在运行时,它即显示异常: The service cannot be activated because it does not support ASP.N ...

  2. Oracle忘记密码的处理办法

    可能有的人在很长一段时间不用Oracle数据库,然后在反过来用的时候就会发现自己依然忘记了密码... 这里提供一个忘记密码后的解决办法 首先呢,你打开数据库用 sys或者是sysdba超级管理员用户名 ...

  3. 用node-webkit(NW.js)创建桌面程序

    以往写windows桌面程序需要用MFC.C#之类的技术,那么如果你只会web开发技术呢?或者说你有一个网站,但是你想把你的网站打包成一个桌面应用程序,该如何做呢? 答案就是用node-webkit这 ...

  4. DCloud与APICloud的对比

    DCloud与APICloud这两家目前应该说是市场占有率和人气较高的国内团队:国内还有一些其他的方案如AppCan.exMobi之类的,但可能是商业运作手法上Big不够,近两年的名气不太大,但各自其 ...

  5. FNV哈希算法

    由来:FNV哈希算法全名为Fowler-Noll-Vo算法,是以三位发明人Glenn Fowler,Landon Curt Noll,Phong Vo的名字来命名的,最早在1991年提出. 特点和用途 ...

  6. idea配置maven并添加镜像配置

    1.打开maven存放文件夹找到 conf ->settings.xml 找到<mirrors>节点把下面内容写入节点内 配置为阿里云的镜像 <mirror> <i ...

  7. Scalaz(27)- Inference & Unapply :类型的推导和匹配

    经过一段时间的摸索,用scala进行函数式编程的过程对我来说就好像是想着法儿如何将函数的款式对齐以及如何正确地匹配类型,真正是一种全新的体验,但好像有点太偏重学术型了. 本来不想花什么功夫在scala ...

  8. ThinkCMF-如何收藏

    注:收藏对应的表名-cmf_user_favorites <php> $object_id = "1"; </php> <a href="{ ...

  9. Android library projects cannot be launched

    今天我用SDK自带的ApiDemos建了一个工程,运行的时候出现问题,提示:Android library projects cannot be launched 解决办法如下: 右键工程根目录-&g ...

  10. Java经典实例:在文本中匹配换行符

    默认情况下,正则表达式 ^ 和 $ 忽略行结束符,仅分别与整个输入序列的开头和结尾匹配.如果激活 MULTILINE 模式,则 ^ 在输入的开头和行结束符之后(输入的结尾)才发生匹配.处于 MULTI ...