MojoDatabase 源码学习之对象映射
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 源码学习之对象映射的更多相关文章
- Spring源码学习
Spring源码学习--ClassPathXmlApplicationContext(一) spring源码学习--FileSystemXmlApplicationContext(二) spring源 ...
- Vue源码学习二 ———— Vue原型对象包装
Vue原型对象的包装 在Vue官网直接通过 script 标签导入的 Vue包是 umd模块的形式.在使用前都通过 new Vue({}).记录一下 Vue构造函数的包装. 在 src/core/in ...
- Java集合专题总结(1):HashMap 和 HashTable 源码学习和面试总结
2017年的秋招彻底结束了,感觉Java上面的最常见的集合相关的问题就是hash--系列和一些常用并发集合和队列,堆等结合算法一起考察,不完全统计,本人经历:先后百度.唯品会.58同城.新浪微博.趣分 ...
- MVC系列——MVC源码学习:打造自己的MVC框架(四:了解神奇的视图引擎)
前言:通过之前的三篇介绍,我们基本上完成了从请求发出到路由匹配.再到控制器的激活,再到Action的执行这些个过程.今天还是趁热打铁,将我们的View也来完善下,也让整个系列相对完整,博主不希望烂尾. ...
- MVC系列——MVC源码学习:打造自己的MVC框架(一:核心原理)
前言:最近一段时间在学习MVC源码,说实话,研读源码真是一个痛苦的过程,好多晦涩的语法搞得人晕晕乎乎.这两天算是理解了一小部分,这里先记录下来,也给需要的园友一个参考,奈何博主技术有限,如有理解不妥之 ...
- hashMap源码学习记录
hashMap作为java开发面试最常考的一个题目之一,有必要花时间去阅读源码,了解底层实现原理. 首先,让我们看看hashMap这个类有哪些属性 // hashMap初始数组容量 static fi ...
- Spring源码学习-容器BeanFactory(四) BeanDefinition的创建-自定义标签的解析.md
写在前面 上文Spring源码学习-容器BeanFactory(三) BeanDefinition的创建-解析Spring的默认标签对Spring默认标签的解析做了详解,在xml元素的解析中,Spri ...
- Underscore.js 源码学习笔记(上)
版本 Underscore.js 1.9.1 一共 1693 行.注释我就删了,太长了… 整体是一个 (function() {...}()); 这样的东西,我们应该知道这是一个 IIFE(立即执行 ...
- mongo源码学习(三)请求接收传输层
在上一篇博客中(mongo源码学习(二)db.cpp之mongoDbMain方法分析),我们把db.cpp中的mongoDbMain的执行过程分析了一下,最后会调用initAndListen(serv ...
随机推荐
- Web API应用架构设计分析(1)
Web API 是一种应用接口框架,它能够构建HTTP服务以支撑更广泛的客户端(包括浏览器,手机和平板电脑等移动设备)的框架, ASP.NET Web API 是一种用于在 .NET Framewor ...
- 从C#到Objective-C,循序渐进学习苹果开发(5)--利用XCode来进行IOS的程序开发
本随笔系列主要介绍从一个Windows平台从事C#开发到Mac平台苹果开发的一系列感想和体验历程,本系列文章是在起步阶段逐步积累的,希望带给大家更好,更真实的转换历程体验.前面几篇随笔主要介绍C#和O ...
- ASP.NET中Request.RawUrl、Request.Url的区别
如果访问的地址是: http://hovertree.com/guestbook/addmessage.aspx?key=hovertree%3C&n=myslider#zonemenu 那么 ...
- c# datetime 格式化
//c datetime 格式化 DateTime dt = DateTime.Now; Label1.Text = dt.ToString();//2005-11-5 13:21:25 Label2 ...
- jQuery使用经验建议
在开发过很多 jQuery 插件以后,我慢慢的摸索出了一套开发jQuery插件比较标准的结构和模式.这样我就可以复制并粘贴大部分的代码结构,只要专注最主要的逻辑代码就行了. 使用相同的设计模式和架构也 ...
- Tarjan算法---强联通分量
1.基础知识 在有向图G,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G是一个强连通图.非强连通图有向图的极大强连通子 ...
- 用xutils3.0进行下载
写的例子比较简单,是用xutils3.0来进行下载项目更新 1.先通过网络请求,判断版本是否要更新 2.若要更新,则弹出一个弹窗,我用的是系统自带的Dialog,将下载的版本号及下载的内容提示展示出来 ...
- Java面试题系列 提高Java I/O 性能
1.提高java的 i/o性能.. http://blog.csdn.net/cherami/article/details/3854 我们知道Java中一般的输入输出流都是用单字节的读取方法来进行I ...
- 关于JAVA数据储存
关于JAVA数据储存: 在JAVA中,有六个不同的地方可以存储数据: 1. 寄存器(register) 这是最快的存储区,因为它位于不同于其他存储区的地方--处理器内部.但是寄存器的数量极其有限,所以 ...
- java 用 jxl poi 进行excel 解析 *** 最爱那水货
/** * 解析excel文件 ,并把数据放入数组中 格式 xlsx xls * @param path 从ftp上下载到本地的文件的路径 * @return 数据数组集合 */ public Lis ...