ios开发之数据的持久化存储机制
IOS中数据的持久化保存这块内容,类似于Android中文件的几种常见的存储方式。
对于数据的持久化存储,ios中一般提供了4种不同的机制。
1.属性列表
2.对象归档
3.数据库存储(SQLite3)
4.苹果公司提供的持久性工具Core Data。
其实储存的形式无非就这么几种,而我们还必须要关心的是,这些文件会被放置在那个文件下,然后如何读取。
也就是说:IOS上数据存储,我们要了解的两点,数据存储格式(也就是存储机制),数据存储位置。
1》文件如何存储(如上面4点)
2》文件存储在哪里。
对于数据的操作,其实我们关心的是操作的速率。
就好比在Adnroid中偏好存储,数据库存储,io存储一样。
我大致问了我们公司新来的ios哥们,他说他们培训机构基本对数据操作这块就讲了属性列表和数据库,以及普通的文件存储(比如音视频图这些多媒体数据)。
我就只好先看看书了。
一:应用文件目录
首先我们来看了解下ios数据存储位置,因为只有知道位置路径我们才能去读取数据,而数据的持久化机制不过是针对操作速率来考虑的,
比如我们大致知道属性列表(既键值对形式)的存储熟虑应该高于数据库高于io文件流存储。
我们在选择用何种机制存储数据,主要也是看数据的形式。
一个ios应用安装后大致会有如下文件夹及其对应路径:
在mac上看模拟器中应用路径:
/Users/nono/Library/Application Support/iPhone Simulator/5.1/Applications/2D135859-1E80-4754-B36D-34A53C521DE3
你在finder中的home下可能找不到Library这个目录,因为貌似是影藏起来了(我这机器上是,在终端可以看到)。
最后那一窜的类似序列号的东西就是ios自动给应用生成的一组应用唯一识别码最为了应用的home目录名。
其下面就是上图所示了。
书上对这些文件夹介绍:
Document:应用程序将其数据存储在这个文件夹下,基于NSUserDefaults的首选项的设置除外。
简单理解是,基本上我们要操作的一些数据都是存储在这个文件夹下面的
TIPS:这边提下一点,对于ios系统这么分配文件夹,是因为在设备进行同步时,ITunes有选择性的意识来备份文件。
比如我们可以猜到,tmp下的应该就不会备份了。
对于Document文件夹目录路径的获取,API提供了这么一种方法:
[cpp] view plaincopy
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docPath = [paths objectAtIndex:0];
Library:基于NSUserDefault首选项设置存储在其下Preferences文件夹中,简单来说,这个文件夹一般你很少操作到。
书上对于这部分基本没介绍。估计对于初级部分是跳过了。
Tmp:应用临时存储文件,当不需要时,应用负责删除其下的文件数据。
该文件也提供了目录获取方法:
Java代码
- - (void)encodeWithCoder:(NSCoder *)aCoder
- { //encoder
- [aCoder encodeObject:stringAforKey:@"1"];
- [aCoder encodeObject:stringBforKey:@"2"];
- }
- - (id)initWithCoder:(NSCoder *)aDecoder
- {
- //decoder
- if (self = [superinit]) {
- 10. stringA = [[aDecoder decodeObjectForKey:@"1"] retain];
- 11. stringB = [[aDecoder decodeObjectForKey:@"2"] retain];
- 12. }
- 13. returnself;
14. }
- 15.
16. #pragma NSCopying协议实现
17. - (id)copyWithZone:(NSZone *)zone
18. {
- 19. TestObj *copy = [[[selfclass] allocWithZone:zone] init];
- 20. copy.stringA = [[self.stringAcopyWithZone:zone] autorelease];
- 21. copy.stringB = [[self.stringBcopyWithZone:zone] autorelease];
- 22. return copy;
23. }
24. @end
然后是对对象归档的读取和写入
[cpp] view plaincopy
//读取归档文件
NSData *data = [[NSMutableDataalloc] initWithContentsOfFile:myFile];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiveralloc] initForReadingWithData:data];
TestObj * test = [unarchiver decodeObjectForKey:@"data"];
[unarchiver finishDecoding];
[data release];
[unarchiver release];
//写入归档文件
NSMutableData *data1 = [[NSMutableDataalloc] init];
NSKeyedArchiver *archiver = [[NSKeyedArchiveralloc] initForWritingWithMutableData:data1];
[archiver encodeObject:test forKey:@"data"];
[archiver finishEncoding];
[data writeToFile:myFile atomically:YES];
[data1 release];
[archiver release];
[test release];
但是问了下新同事,据说这个用到也是蛮少,至少他目前。
但是,我看了下,觉得这个和Android 中Parcelable
太尼玛像似了
三.数据库存储
和Android一样,ios中也是用了SQLite3这种嵌入式数据库。
这个网上例子是很多了。我这边就大致看下了数据库的打开,
数据库表创建,查询,插入
[cpp] view plaincopy
//数据库操作
sqlite3 *database;
// const NSString * dbname = @"mydb"
int result;
//打开一个指定路径的现有的数据库,如果没有则会新建一个db库
result = sqlite3_open([myFile UTF8String], &database);
if (result != SQLITE_OK) {
sqlite3_close(database);
}
//创建一个db表
char *errorMsg;
NSString *sql_create_table = @"CREATE TABLE IF NOT EXISTS NONOTABLE 省略~~~~~~~~~~~~~";
int result1 ;
//sqlite_exec用了针对sqlite3运行任何不要返回数据的命令,它用于执行更新,插入和删除。简单来说,这个方法执行的都是一些无需返回数据(虽然我们可能获取一个状态值。)。
result1 = sqlite3_exec(database, [sql_create_table UTF8String], NULL, NULL, &errorMsg);
//检索查询操作
int result2 ;
sqlite3_stmt *statment;
NSString *sql_selected = @"查询语句";
result2 = sqlite3_prepare_v2(database, [sql_selected UTF8String], -1, &statment, nil);
if(result2 == SQLITE_OK){
//单步操作
while (sqlite3_step(statment) == SQLITE_ROW) {
int row = sqlite3_column_int(statment, 0);
char * rpwData = sqlite3_column_text(statment, 1);
}
sqlite3_finalize(statment);
}
//绑定变量,既就是插入操作的一种变种,比如我么那上面提到sqlite_exec可以执行插入操作,插入内容直接是写在sql字窜里,但是考虑到字窜涉及到无效的符号以及会一些严重的注入漏洞(比如以前听过的引号符号)。
NSString *sql_bind = @"insert into foo value(?,?)";
result2 = sqlite3_prepare_v2(database, [sql_selected UTF8String], -1, &statment, nil);
if(result2 == SQLITE_OK){
sqlite3_bind_int(statment, 1, 235);
sqlite3_bind_text(statment, 2, "test", -1, nil);
sqlite3_finalize(statment);
}
if (sqlite3_step(statment) != SQLITE_DONE)
NSLog(@"error");
sqlite3_finalize(statment);
sqlite3_close(database);
关于更多的,大伙可以自行百度,因为数据库的操作语法太怪异了,书上说是基本是基于c的,本人没学过c。看得有点心烦~
4。Core Data存储机制
大致浏览下基本感觉就是将对象归档搞成了可视化和简单化。
这块内容比较多。网上资料也挺丰富的。
暂时不做介绍了。
总结下:其实对于ios数据存储,最常用和主要要掌握的就是属性列表和数据库,因为两个是出镜率比较高的。
其他可能在数据存明显体现出储优势时,我们会去考虑用另外两种机制。
基础的来说,必须掌握属性列表和sqlite的操作存储。
ios开发之数据的持久化存储机制的更多相关文章
- IOS开发中数据持久化的几种方法--NSUserDefaults
IOS开发中数据持久化的几种方法--NSUserDefaults IOS 开发中,经常会遇到需要把一些数据保存在本地的情况,那么这个时候我们有以下几种可以选择的方案: 一.使用NSUserDefaul ...
- 李洪强iOS开发之数据存储
李洪强iOS开发之数据存储 iOS应用数据存储的常用方式 1.lXML属性列表(plist)归档 2.lPreference(偏好设置) 3.lNSKeyedArchiver归档(NSCoding) ...
- iOS开发系列--数据存取
概览 在iOS开发中数据存储的方式可以归纳为两类:一类是存储为文件,另一类是存储到数据库.例如前面IOS开发系列-Objective-C之Foundation框架的文章中提到归档.plist文件存储, ...
- 【转】iOS开发系列--数据存取
原文: http://www.cnblogs.com/kenshincui/p/4077833.html#SQLite 概览 在iOS开发中数据存储的方式可以归纳为两类:一类是存储为文件,另一类是存储 ...
- 小程序开发技巧(三)-- 云开发时效数据刷新和存储 (access_token等)
小程序云开发时效数据刷新和存储 (access_token等) 1.问题描述 小程序中经常有需要进行OCR识别,或者使用外部api例如百度AI识别等接口,请求调用这些接口需要令牌,即一些具有时效性的数 ...
- iOS开发网络数据之AFNetworking使用
iOS开发网络数据之AFNetworking使用 如何选择AFNetworking版本 首先得下载AFNetworking库文件,下载时得首先弄清楚,你将要开发的软件兼容的最低版本是多少.AFNetw ...
- Can JavaScript connect with MySQL? 浏览器控制台的js采集数据结果持久化存储
浏览器控制台的js采集数据结果持久化存储 how to open a file in javascript https://developer.mozilla.org/en-US/docs/Web/A ...
- iOS开发_数据存储方式
对于数据持久化的问题,博主并不准备在博文内放很多的代码进行更深一步解释,只是简单的介绍一下四种数据持久化,如有时间,会另外针对各个数据持久化的方法进行更进一步的阐述. 直接进入主题: 〈1.NSUse ...
- 【转】iOS开发24:使用SQLite3存储和读取数据
转自:http://my.oschina.net/plumsoft/blog/57626 SQLite3是嵌入在iOS中的关系型数据库,对于存储大规模的数据很有效.SQLite3使得不必将每个对象都加 ...
随机推荐
- hdu 4739 状压DP
这里有状态压缩DP的好博文 题目:题目比较神,自己看题目吧 分析: 大概有两种思路: 1.dfs,判断正方形的话可以通过枚举对角线,大概每次减少4个三角形,加上一些小剪枝的话可以过. 2.状压DP,先 ...
- 社区APP “钱途”漫漫
花样年曾宣称:2013年“彩生活”物业品牌收入1.85亿,毛利率超过40%:万科万客会APP.龙湖物业APP……大量房地产企业依托物业企业,纷纷瞄准移动互联网.云计算.物联网等高新科技为基础的物业服务 ...
- centos 6.5 安装lnmp(linux+nginx+mysql+php)
参考:http://www.cnblogs.com/AloneSword/archive/2013/03/18/2966750.html (总结并简要) 一安装cmake wget -c http:/ ...
- ASP流程控制语句
ASP流程控制语句 1.if...then语句 单行: if 条件 then 语句 多行: if 条件 then elseif 条件 then 语句 elseif 条件 then 语句 else en ...
- github 学习笔记【一】
这几天在学习github ,其实学了主要用来管理自己的项目!因为要在家里和公司两头做! 所以就开始学习使用!目前熟练几个命令,其他的一边用一遍学吧!想一举成功应该是不太可能的! 反复记忆才能更好,据说 ...
- 防止服务器被暴力破解使用DenyHosts
公司有台服务器被坏人盯上了,通过日志可以看到一直在做暴力破解ssh. 防止服务器被暴力破解使用DenyHosts 参考链接: 防止ssh破解,Ubuntu安装denyhosts的一些问题 防止你的ss ...
- [老老实实学WCF] 第十篇 消息通信模式(下) 双工
老老实实学WCF 第十篇 消息通信模式(下) 双工 在前一篇的学习中,我们了解了单向和请求/应答这两种消息通信模式.我们知道可以通过配置操作协定的IsOneWay属性来改变模式.在这一篇中我们来研究双 ...
- 分享10款功能强大的HTML5/CSS3应用插件
1.纯CSS3美化Checkbox和Radiobox按钮 外观很时尚 利用CSS3我们可以打造非常具有个性化的用户表单,今天我们就利用CSS3美化Checkbox复选框和Radiobox单选框.CSS ...
- age
#include<iostream> #include<math.h> #define pi 3.14 using namespace std; int main() { in ...
- Windows Phone 中查找可视化树中的某个类型的元素
private void StackPanel_Tap(object sender, TappedRoutedEventArgs e) { //获取到的对象是ListBoxItem ListBoxIt ...