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. 使用 TOP 限制更新的数据

    可以使用 TOP 子句来限制 UPDATE 语句中修改的行数.当 TOP (n) 子句与 UPDATE 一起使用时,将针对随机选择的 n 行执行删除操作.例如,假设您要为一位高级销售人员减轻销售负担, ...

  2. eclipse设置及快捷键

    快捷键 查看所有快捷键: Ctrl+Shift+L 调试代码: F11 逐语句: F5 逐过程: F6 快速执行代码: Ctrl+F11 自动格式化代码: Ctrl+Shift+F 在本行代码下插入新 ...

  3. sql 删除重复行

    1.查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断 select * from people where peopleId in (select peopleId from ...

  4. 认识IoC

    第一次接触IoC是我在学习MVP框架的时候,搭建一个MVP框架需要用到IoC,那时候就以为IoC就是依赖注入,但在后来的逐步了解中发现那个只是它的别名而已.IoC全称应该是Inversion of C ...

  5. vs2010 用户控件拖到aspx页面不可用

    错误描述: 在web项目中添加一个用户控件,直接拖动用户控件ascx到aspx页面出现a标签而不是控件标签 解决办法: 把“源”切换为“设计”视图,然后拖动ascx用户控件到页面即可:

  6. Ajax实现定时刷新页面

    function deleteValue(){ var refresh = function() { $.ajax({   type:'post',   url:'/Application/index ...

  7. C#实现二叉树的各种遍历

    1. 引言 在实际的项目中,树还是用的比较多的一种,尤其是对于具有层次结构的数据.相信很多人都学过树的遍历,比如先序遍历,后序遍历等,利用递归还是很容易理解的. 今天给大家介绍下二叉树的几种遍历算法, ...

  8. javascript--Function

    概述 函数的声明 (1)function命令 函数就是使用function命令命名的代码区块,便于反复调用. function print(){ // ... } 上面的代码命名了一个print函数, ...

  9. C#微信公众平台开发者模式开启代码

    using System;using System.IO;using System.Text;using System.Web.Security; namespace HPZJ.Web.sys.exc ...

  10. [deviceone开发]-仿微信应用(一):框架搭建

    一.简介 这个示例是一步一步跟我学DeviceOne开发 - 仿微信应用系列文档对应的文档.详细介绍了ListView,IndexListView,add方法等常用功能,推荐初学者学习. 二.效果图 ...