`
844604778
  • 浏览: 548707 次
文章分类
社区版块
存档分类
最新评论

IOS数据存储方式总结

 
阅读更多

对于数据的持久化存储,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:应用临时存储文件,当不需要时,应用负责删除其下的文件数据。
该文件也提供了目录获取方法:
[cpp] view plaincopy
NSString *tmpDoc = NSTemporaryDirectory();
应用程序文件:这个基本没提到书上,但是我们大致可以猜测,这就是整个应用程序的程序文件夹吧。
好了,以上我们大致解决了我们提到的第一个点,文件存储目录
二:数据存储机制
1.属性列表
这个其实我们早见过,plist就是,感觉用来存储键值对小数据是最合适,因为速率很高。
这个存储机制很简单,对于前面我们使用过了在plist文件来读取数据填充一些列表,只不过那会plist文件存储位置不同,
用的是Mainbundle什么的来返回文件夹,其实这边我也推测,上面提到有个应用程序文件夹,它下面的文件就是这么来读取的~(反正暂时不管他)
这边不过就是改变了存储位置,数据操作还是一样的
[cpp] view plaincopy
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docPath = [paths objectAtIndex:0];
NSString *myFile = [docPath stringByAppendingPathComponent:@"my.list"];
//读取文件
NSArray *array = [[NSArray alloc] initWithContentsOfFile:myFile];
//操作完若修改了数据则,写入文件
[array writeToFile:myFile atomically:YES];
2.对象归档
上面的属性列表存储机制,我们都知道,这个机制支持NSArray,NSDictionary,NSData,NSString,NSNumber,NSDate 等等
这些对象直接写入plist文件中。
那么对于一些复杂对象,我要保存整个这个对象数据呢?
反正我是这么觉得,这个机制很像java中的对象整体序列化。当然,这些数据在读取是就需要遵循一种墨守成规的协议了。
首先我们定义的对象类,必须实现NSCoding和NSCopying协议(额,网上说后面这个不实现也可以,我猜是他对象没有copy操作,因此没出错)书本上反正是实现了这两个协议
然后归档中用到的操作类
NSKeyedArchiver
这边我们定义一个对象,h文件中定义两属性,申明要实现的NSCoding和NSCopying协议
实现文件
[cpp] view plaincopy
//
// TestObj.m
// DataStorageTest
//
// Created by Nono on 12-5-12.
// Copyright (c) 2012年 NonoWithLilith. All rights reserved.
//

#import "TestObj.h"

@implementation TestObj
@synthesize stringA = stringA;
@synthesize stringB = stringB;

#pragma mark -
#pragma NSCoding协议实现实现
- (void)encodeWithCoder:(NSCoder *)aCoder
{ //encoder
[aCoder encodeObject:stringAforKey:@"1"];
[aCoder encodeObject:stringBforKey:@"2"];
}
- (id)initWithCoder:(NSCoder *)aDecoder
{
//decoder
if (self = [superinit]) {
stringA = [[aDecoder decodeObjectForKey:@"1"] retain];
stringB = [[aDecoder decodeObjectForKey:@"2"] retain];
}
returnself;
}

#pragma NSCopying协议实现
- (id)copyWithZone:(NSZone *)zone
{
TestObj *copy = [[[selfclass] allocWithZone:zone] init];
copy.stringA = [[self.stringAcopyWithZone:zone] autorelease];
copy.stringB = [[self.stringBcopyWithZone:zone] autorelease];
return copy;
}
@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);
4。Core Data存储机制
大致浏览下基本感觉就是将对象归档搞成了可视化和简单化。
这块内容比较多。网上资料也挺丰富的。
总结下:其实对于ios数据存储,最常用和主要要掌握的就是属性列表和数据库,因为两个是出镜率比较高的。
其他可能在数据存明显体现出储优势时,我们会去考虑用另外两种机制。
基础的来说,必须掌握属性列表和sqlite的操作存储。

分享到:
评论

相关推荐

    以代码实例总结iOS应用开发中数据的存储方式

    主要介绍了iOS应用开发中数据的存储方式的实例总结,代码为传统的Objective-C语言,需要的朋友可以参考下

    iOS 系统化知识总结.zip

    软件开发设计:PHP、QT、...云计算与大数据:数据集、包括云计算平台、大数据分析、人工智能、机器学习等,云计算是一种基于互联网的计算方式,通过这种方式,共享的软硬件资源和信息可以按需提供给计算机和其他设备。

    iOS系统原理总结.zip

    软件开发设计:PHP、QT、...云计算与大数据:数据集、包括云计算平台、大数据分析、人工智能、机器学习等,云计算是一种基于互联网的计算方式,通过这种方式,共享的软硬件资源和信息可以按需提供给计算机和其他设备。

    iOS中系统弹出框总结.zip

    软件开发设计:PHP、QT、...云计算与大数据:数据集、包括云计算平台、大数据分析、人工智能、机器学习等,云计算是一种基于互联网的计算方式,通过这种方式,共享的软硬件资源和信息可以按需提供给计算机和其他设备。

    iOS逆向技术视频教程

    数据存储 课时09.类与方法 课时10.runtime特性 课时11.认识Hook 课时12.Hook原理 课时13.ARM汇编(上) 课时14.ARM汇编(下) 课时15.Mach-O文件格式(上) 课时16.Mach-O文件格式(下) 课时17.App签名 课时18....

    移动应用开发技巧以及入门教程知识点总结.docx

    数据持久化:掌握SQLite数据库操作,了解Shared Preferences、Core Data等本地数据存储方式。 JSON解析:能使用Gson、Jackson、JSONModel等进行JSON数据解析与序列化。 GPS定位:了解并实现GPS和网络定位功能,...

    -saveData:主要是实现NSUserDefault存储数据,压缩和解档数据,FMDataBase的实现

    简书地址:iOS开发中数据持久化总结(一) iOS开发中数据持久化总结(二):NSUserDefault实现存储数据 iOS开发中数据持久化总结(三):NSKeyArchive压缩解档的实现 iOS开发中数据持久化总结(四):使用FMDataBase...

    基于Android 系统的动画总结.zip

    软件开发设计:PHP、QT、...云计算与大数据:数据集、包括云计算平台、大数据分析、人工智能、机器学习等,云计算是一种基于互联网的计算方式,通过这种方式,共享的软硬件资源和信息可以按需提供给计算机和其他设备。

    Android (系统+自定义)短视频录制(含暂停继续录制功能) 总结.zip

    软件开发设计:PHP、QT、...云计算与大数据:数据集、包括云计算平台、大数据分析、人工智能、机器学习等,云计算是一种基于互联网的计算方式,通过这种方式,共享的软硬件资源和信息可以按需提供给计算机和其他设备。

    Android、Java程序员面试资源总结,涉及Java、Android、网络、操作系统、算法等.zip

    软件开发设计:PHP、QT、...云计算与大数据:数据集、包括云计算平台、大数据分析、人工智能、机器学习等,云计算是一种基于互联网的计算方式,通过这种方式,共享的软硬件资源和信息可以按需提供给计算机和其他设备。

    SSSC-iOS-App:卡尔顿大学理科学生成功中心的iOS应用

    使用/events和/mentors端点使用对SSSC服务器(上面链接)的GET请求检索事件和指导者数据,以避免在应用程序内部进行不必要的解析等。 入门 您需要执行几个不同的步骤才能使用该应用程序。 当然,不用说,在开始之前...

    一个采用thinkphp3.2开发的商城系统.zip

    首先作为一套前台模板框架...云计算与大数据:数据集、包括云计算平台、大数据分析、人工智能、机器学习等,云计算是一种基于互联网的计算方式,通过这种方式,共享的软硬件资源和信息可以按需提供给计算机和其他设备。

    新浪微博逆向总结4-22.docx

    Android逆向,逆向新浪微博的账密登录、短信登录验证,完成对新浪存储数据的获取,同时支持不同设备账密登录验证。

    微信小程序-仿 [一个]微信小程序

    入坑小程序,之前本来是决定各种文艺的APP的借鉴一下,发现自己的设计水平实在不行,请求的都是ONE的后台数据,所以最后还是按着ONE的IOS版本仿制了一下。 项目演示 简单说明 基于微信开发的微信小程序 数据...

    Younode-crx插件

    younode是一个分布式个人数据存储。除ID和密码外,您还可以管理自己的数据,例如网络购物的购买历史。数据可以使用私钥加密,也可以选择存储位置。※目前,仅执行ID /密码管理功能。________ 主功能 _______◆我的...

    React Native 开发指南_中文扫描完整版

    6.3 AsyncStore 持久化数据存储 108 6.4 智能天气应用 109 6.5 小结 119 第7章 模块 120 7.1 使用npm 安装JavaScript 类库 120 7.2 iOS 原生模块 121 7.3 Android 原生模块 130 7.4 跨平台原生模块 139 7.5 ...

    面向企事业单位的项目申报小程序--(源码+部署说明+演示视频+源码介绍+lw).zip

    数据库选择:根据需求可能会使用MySQL、MongoDB或其他数据库系统来存储用户数据、项目信息和申报记录。 云服务:小程序可能会集成微信云开发能力,利用云函数和云数据库来实现后端逻辑,减少服务器维护工作。 安全性...

    现代C++程序设计

    2.6.5 数据类型及其存储的值 2.6.6 算术运算符 2.6.7 自增运算符和自减运算符 2.6.8 复合赋值运算符 2.7 #define、const和数据类型转换 2.7.1 #define预处理指令 2.7.2 const修饰符 2.7.3 const比#define好吗 2.7.4...

Global site tag (gtag.js) - Google Analytics