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 ...
随机推荐
- IHTMLDocument2
{IHTMLDocument2 方法:} write //写入 writeln //写入并换行 open //打开一个流,以收集 document.write 或 document.writeln 的 ...
- 一个比较有意思的C语言问题
先看代码吧,学习c语言结构体中看到的一个问题 #include<stdio.h> int main(){ struct{ int a:2; }x; x.a=; x.a=x.a+; prin ...
- 其实Unix很简单
很多编程的朋友都在网上问我这样的几个问题,Unix怎么学?Unix怎么这么难?如何才能学好?并且让我给他们一些学好Unix的经验.在绝大多数时候,我发现问这些问题的朋友都有两个特点: 1)对Unix有 ...
- Excel导入数据库脚本
--数据库中不存在需要导入的表 SELECT * INTO tab_PurchasePriceTemp FROM OPENROWSET( 'Microsoft.Jet.OLEDB.4.0', 'EXC ...
- 用dos开启apache问题说明
- SharedPreferences写入和读出数据
Android中有很多方法存储数据,如SharedPreferences.SQLite数据库等.简单数据的存储适用SharedPreferences. 本文使用SharedPreferences写入和 ...
- linux 如何改变文件属性与权限
我们知道档案权限对于一个系统的安全重要性,也知道档案的权限对于使用者与群组的相关性, 那如何修改一个档案的属性与权限呢? 我们这里介绍几个常用于群组.拥有者.各种身份的权限的指令.如下所示: chgr ...
- Java在方法作用域内创建的内部类
在方法作用域内创建的内部类,用来实现一个接口 /** * Created by xfyou on 2016/11/3. * Java内部类演示 */ public class Parcel3 { pu ...
- 一些ajax代码
$.ajax({ type : "get", url : "list_hot_ajax.json", data : {"provinceId" ...
- jQuery立体式数字动态增加(animate方法)
1.HTML结构 <div class="integral">已有<span class="ii"></span>积分< ...