在iOS开发中数据存储的模式可能演绎为两类:一类是存储为文件,另一类是存储到数据库。例如后面IOS开发系列―Objective-C之Foundation框架的文章中提到归档、plist文件存储,包括偏好设置其实质都是存储为文件,只是说归档或许plist文件存储可能抉择保存到沙盒中,而偏好设置系统已经规定只能保存到沙盒的Library/Preferences目录。当然,文件存储并不作为本文的重点内容。本文重点还是说数据库存储,做过数据库开发的冤家应该知道,可能经过SQL间接访问数据库,也可能经过ORM停止对象关系映射访问数据库。这两种模式恰好对应iOS中SQLite和Core Data的内容,在此将重点停止剖析:
SQLite
Core Data
FMDB
SQLite
SQLite是目前支流的嵌入式关系型数据库,其最次要的特点就是轻量级、跨平台,以后很多嵌入式操作系统都将其作为数据库首选。只管SQLite是一款轻型数据库,然而其性能也绝不亚于很多大型关系数据库。学习数据库就要学习其相干的定义、操作、查询言语,也就是大家日常说得SQL语句。和其余数据库相比,SQLite中的SQL语法并没有太大的差别,因此这里对于SQL语句的内容不会过多赘述,大家可能参考SQLite中其余SQL相干的内容,这里还是重点讲解iOS中如何利用SQLite构建运用程序。先看一下SQLite数据库的几个特点:
基于C言语开发的轻型数据库
在iOS中需求利用C言语语法停止数据库操作、访问(无奈利用ObjC间接访问,由于libsqlite3框架基于C言语编写)
SQLite中采用的是动态数据类型,即使创建时定义了一种类型,在实践操作时也可能存储其余类型,然而引荐建库时利用适合的类型(顺便是运用需求思考跨平台的情况时)
建设衔接后通常不需求关闭衔接(虽然可能手动关闭)
要利用SQLite很简略,假设在Mac OSX上利用可能思考到SQLite网站下载命令行工具,也可能利用类似于SQLiteManager、Navicat for SQLite等工具。为了方便大家开发调试,建议在开发环境中装置上述工具。
在iOS中操作SQLite数据库可能分为以下几步(留意先在名目中导入libsqlite3框架):
打开数据库,应用sqlite3_open()打开数据库会指定一个数据库文件保存门路,假设文件存在则间接打开,否则创建并打开。打开数据库会失去一个sqlite3类型的对象,前面需求借助这个对象停止其余操作。
执行SQL语句,无锡网站开发,执行SQL语句又包括有前往值的语句和无前往值语句。
对于无前往值的语句(如添加、删除、修正等)间接经过sqlite3_exec()函数执行;
对于有前往值的语句则首先经过sqlite3_prepare_v2()停止sql语句评价(语法检测),然后经过sqlite3_step()依次取出查询后果的每一行数据,对于每行数据都可能经过对应的sqlite3_column_类型()方法获得对应列的数据,如此重复循环直到遍历实现。当然,最后需求监禁句柄。
在整个操作过程中无需治理数据库衔接,对于嵌入式SQLite操作是持久衔接(虽然可能经过sqlite3_close()关闭),不需求开发人员本人监禁衔接。纵观整个操作过程,其实与其余平台的开发没有显著的区别,较为费事的就是数据读取,在iOS平台中利用C停止数据读取采用了游标的方式,每次只能读取一行数据,较为费事。因此实践开发中无妨对这些操作停止封装:
KCDbManager.h
// // DbManager.h // DataAccess // // Created by Kenshin Cui on 14-3-29. // Copyright (c) 2014年 Kenshin Cui. All rights reserved. // #import #import #import "KCSingleton.h" @interface KCDbManager : NSObject singleton_interface(KCDbManager); #pragma mark - 属性 #pragma mark 数据库引用,利用它停止数据库操作 @property (nonatomic) sqlite3 *database; #pragma mark - 共有方法 /** * 打开数据库 * * @param dbname 数据库称号 */ -(void)openDb:(NSString *)dbname; /** * 执行无前往值的sql * * @param sql sql语句 */ -(void)executeNonQuery:(NSString *)sql; /** * 执行有前往值的sql * * @param sql sql语句 * * @return 查询后果 */ -(NSArray *)executeQuery:(NSString *)sql; @end
KCDbManager.m
// // DbManager.m // DataAccess // // Created by Kenshin Cui on 14-3-29. // Copyright (c) 2014年 Kenshin Cui. All rights reserved. // #import "KCDbManager.h" #import #import "KCSingleton.h" #import "KCAppConfig.h" #ifndef kDatabaseName #define kDatabaseName @"myDatabase.db" #endif @interface KCDbManager() @end @implementation KCDbManager singleton_implementation(KCDbManager) #pragma mark 重写初始化方法 -(instancetype)init{ KCDbManager *manager; if((manager=[super init])) { [manager openDb:kDatabaseName]; } return manager; } -(void)openDb:(NSString *)dbname{ //取得数据库保存门路,通常保存沙盒Documents目录 NSString *directory=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject]; NSLog(@"%@",directory); NSString *filePath=[directory stringByAppendingPathComponent:dbname]; //假设有数据库则间接打开,否则创建并打开(留意filePath是ObjC中的字符串,需求转化为C言语字符串类型) if (SQLITE_OK ==sqlite3_open(filePath.UTF8String, &_database)) { NSLog(@"数据库打开胜利!"); }else{ NSLog(@"数据库打开失败!"); } } -(void)executeNonQuery:(NSString *)sql{ char *error; //单步执行sql语句,用于插入、修正、删除 if (SQLITE_OK!=sqlite3_exec(_database, sql.UTF8String, NULL, NULL,&error)) { NSLog(@"执行SQL语句过程中发生谬误!谬误信息:%s",error); } } -(NSArray *)executeQuery:(NSString *)sql{ NSMutableArray *rows=[NSMutableArray array];//数据行 //评价语法正确性 sqlite3_stmt *stmt; //反省语法正确性 if (SQLITE_OK==sqlite3_prepare_v2(_database, sql.UTF8String, -1, &stmt, NULL)) { //单步执行sql语句 while (SQLITE_ROW==sqlite3_step(stmt)) { int columnCount= sqlite3_column_count(stmt); NSMutableDictionary *dic=[NSMutableDictionary dictionary]; for (int i=0; i0) { [user setValuesForKeysWithDictionary:rows[0]]; } return user; } -(KCUser *)getUserByName:(NSString *)name{ KCUser *user=[[KCUser alloc]init]; NSString *sql=[NSString stringWithFormat:@"SELECT Id, name,screenName,profileImageUrl,mbtype,city FROM User WHERE", name]; NSArray *rows= [[KCDbManager sharedKCDbManager] executeQuery:sql]; if (rows&&rows.count>0) { [user setValuesForKeysWithDictionary:rows[0]]; } return user; } @end
KCStatusService.h