iOS开发之数据存取.docx
- 文档编号:2775718
- 上传时间:2022-11-15
- 格式:DOCX
- 页数:12
- 大小:28.81KB
iOS开发之数据存取.docx
《iOS开发之数据存取.docx》由会员分享,可在线阅读,更多相关《iOS开发之数据存取.docx(12页珍藏版)》请在冰豆网上搜索。
iOS开发之数据存取
概览在iOS开发中数据存储的方式可以归纳为两类:
一类是存储为文件,另一类是存储到数据库。
例如前面IOS开发系列—Objective-C之Foundation框架的文章中提到归档、plist文件存储,包括偏好设置其本质都是存储为文件,只是说归档或者plist文件存储可以选择保存到沙盒中,而偏好设置系统已经规定只能保存到沙盒的Library/Preferences目录。
当然,文件存储并不作为本文的重点内容。
本文重点还是说数据库存储,做过数据库开发的朋友应该知道,可以通过SQL直接访问数据库,也可以通过ORM进行对象关系映射访问数据库。
这两种方式恰恰对应iOS中SQLite和CoreData的内容,在此将重点进行分析:
1.SQLite2.CoreData3.FMDBSQLiteSQLite是目前主流的嵌入式关系型数据库,其最主要的特点就是轻量级、跨平台,当前很多嵌入式操作系统都将其作为数据库首选。
虽然SQLite是一款轻型数据库,但是其功能也绝不亚于很多大型关系数据库。
学习数据库就要学习其相关的定义、操作、查询语言,也就是大家日常说得SQL语句。
和其他数据库相比,SQLite中的SQL语法并没有太大的差别,因此这里对于SQL语句的内容不会过多赘述,大家可以参考SQLite中其他SQL相关的内容,这里还是重点讲解iOS中如何使用SQLite构建应用程序。
先看一下SQLite数据库的几个特点:
1.基于C语言开发的轻型数据库2.在iOS中需要使用C语言语法进行数据库操作、访问(无法使用ObjC直接访问,因为libqlite3框架基于C语言编写)3.SQLite中采用的是动态数据类型,即使创建时定义了一种类型,在实际操作时也可以存储其他类型,但是推荐建库时使用合适的类型(特别是应用需要考虑跨平台的情况时)4.建立连接后通常不需要关闭连接(尽管可以手动关闭)要使用SQLite很简单,如果在MacOSX上使用可以考虑到SQLite官方网站下载命令行工具,也可以使用类似于SQLiteManager、NavicatforSQLite等工具。
为了方便大家开发调试,建议在开发环境中安装上述工具。
在iOS中操作SQLite数据库可以分为以下几步(注意先在项目中导入libsqlite3框架):
1.打开数据库,利用sqlite3_open()打开数据库会指定一个数据库文件保存路径,如果文件存在则直接打开,否则创建并打开。
打开数据库会得到一个sqlite3类型的对象,后面需要借助这个对象进行其他操作。
2.执行SQL语句,执行SQL语句又包括有返回值的语句和无返回值语句。
3.对于无返回值的语句(如增加、删除、修改等)直接通过sqlite3_exec()函数执行;4.对于有返回值的语句则首先通过sqlite3_prepare_v2()进行sql语句评估(语法检测),然后通过sqlite3_step()依次取出查询结果的每一行数据,对于每行数据都可以通过对应的sqlite3_column_类型()方法获得对应列的数据,如此反复循环直到遍历完成。
当然,最后需要释放句柄。
在整个操作过程中无需管理数据库连接,对于嵌入式SQLite操作是持久连接(尽管可以通过sqlite3_close()关闭),不需要开发人员自己释放连接。
纵观整个操作过程,其实与其他平台的开发没有明显的区别,较为麻烦的就是数据读取,在iOS平台中使用C进行数据读取采用了游标的形式,每次只能读取一行数据,较为麻烦。
因此实际开发中不妨对这些操作进行封装:
KCDbManager.h////DbManager.h//DataAccess////CreatedbyKenshinCuion14-3-29.//Copyright(c)2014年KenshinCui.Allrightsreserved.//#import<Foundation/Foundation.h>#import<sqlite3.h>#import"KCSingleton.h"@interfaceKCDbManager:
NSObjectsingleton_interface(KCDbManager);#pragmamark-属性#pragmamark数据库引用,使用它进行数据库操作@property(nonatomic)sqlite3*database;#pragmamark-共有方法/***打开数据库**@paramdbname数据库名称*/-(void)openDb:
(NSString*)dbname;/***执行无返回值的sql**@paramsqlsql语句*/-(void)executeNonQuery:
(NSString*)sql;/***执行有返回值的sql**@paramsqlsql语句**@return查询结果*/-(NSArray*)executeQuery:
(NSString*)sql;@endKCDbManager.m////DbManager.m//DataAccess////CreatedbyKenshinCuion14-3-29.//Copyright(c)2014年KenshinCui.Allrightsreserved.//#import"KCDbManager.h"#import<sqlite3.h>#import"KCSingleton.h"#import"KCAppConfig.h"#ifndefkDatabaseName#definekDatabaseName@"myDatabase.db"#endif@interfaceKCDbManager()@end@implementationKCDbManagersingleton_implementation(KCDbManager)#pragmamark重写初始化方法-(instancetype)init{KCDbManager*manager;if((manager=[superinit])){[manageropenDb:
kDatabaseName];}returnmanager;}-(void)openDb:
(NSString*)dbname{//取得数据库保存路径,通常保存沙盒Documents目录NSString*directory=[NSSearchPathForDirectoriesInDomains(NSDocumentationDirectory,NSUserDomainMask,YES)firstObject];NSLog(@"%@",directory);NSString*filePath=[directorystringByAppendingPathComponent:
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=[NSMutableArrayarray];//数据行//评估语法正确性sqlite3_stmt*stmt;//检查语法正确性if(SQLITE_OK==sqlite3_prepare_v2(_database,sql.UTF8String,-1,&stmt,NULL)){//单步执行sql语句while(SQLITE_ROW==sqlite3_step(stmt)){intcolumnCount=sqlite3_column_count(stmt);NSMutableDictionary*dic=[NSMutableDictionarydictionary];for(inti=0;i<columnCount;i++){constchar*name=sqlite3_column_name(stmt,i);//取得列名constunsignedchar*value=sqlite3_column_text(stmt,i);//取得某列的值dic[[NSStringstringWithUTF8String:
name]]=[NSStringstringWithUTF8String:
(constchar*)value];}[rowsaddObject:
dic];}}//释放句柄sqlite3_finalize(stmt);returnrows;}@end在上面的类中对于数据库操作进行了封装,封装之后数据操作更加方便,同时所有的语法都由C转换成了ObjC。
下面仍然以微博查看为例进行SQLite演示。
当然实际开发中微博数据是从网络读取的,但是考虑到缓存问题,通常会选择将微博数据保存到本地,下面的Demo演示了将数据存放到本地数据库以及数据读取的过程。
当然,实际开发中并不会在视图控制器中直接调用数据库操作方法,在这里通常会引入两个概念Model和Service。
Model自不必多说,就是MVC中的模型。
而Service指的是操作数据库的服务层,它封装了对于Model的基本操作方法,实现具体的业务逻辑。
为了解耦,在控制器中是不会直接接触数据库的,控制器中只和模型(模型是领域的抽象)、服务对象有关系,借助服务层对模型进行各类操作,模型的操作反应到数据库中就是对表中数据的操作。
具体关系如下:
要完成上述功能,首先定义一个应用程序全局对象进行数据库、表的创建。
为了避免每次都创建数据库和表出错,这里利用了偏好设置进行保存当前创建状态(其实这也是数据存储的一部分),如果创建过了数据库则不再创建,否则创建数据库和表。
KCDatabaseCreator.m////KCDatabaseCreator.m//DataAccess////CreatedbyKenshinCuion14-3-29.//Copyright(c)2014年KenshinCui.Allrightsreserved.//#import"KCDatabaseCreator.h"#import"KCDbManager.h"@implementationKCDatabaseCreator+(void)initDatabase{NSString*key=@"IsCreatedDb";NSUserDefaults*defaults=[[NSUserDefaultsalloc]init];if([[defaultsvalueForKey:
key]intValue]!
=1){[selfcreateUserTable];[selfcreateStatusTable];[defaultssetValue:
@1forKey:
key];}}+(void)createUserTable{NSString*sql=@"CREATETABLEUser(IdintegerPRIMARYKEYAUTOINCREMENT,nametext,screenNametext,profileImageUrlt
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- iOS 开发 数据 存取