`
倾城一屁
  • 浏览: 75237 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

ios开发之数据的持久化存储机制

    博客分类:
  • 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:应用临时存储文件,当不需要时,应用负责删除其下的文件数据。
该文件也提供了目录获取方法:
- (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); 

关于更多的,大伙可以自行百度,因为数据库的操作语法太怪异了,书上说是基本是基于c的,本人没学过c。看得有点心烦~

4。Core Data存储机制
大致浏览下基本感觉就是将对象归档搞成了可视化和简单化。
这块内容比较多。网上资料也挺丰富的。
暂时不做介绍了。

总结下:其实对于ios数据存储,最常用和主要要掌握的就是属性列表和数据库,因为两个是出镜率比较高的。
其他可能在数据存明显体现出储优势时,我们会去考虑用另外两种机制。
基础的来说,必须掌握属性列表和sqlite的操作存储。
分享到:
评论

相关推荐

    ios 数据持久化存储

    在iOS开发中,数据持久化是至关重要的,它允许应用程序在用户关闭应用或者设备重启后仍然保留数据。本文将深入探讨iOS中的几种主要数据持久化技术:Preference(偏好设置)、文件存储、归档、数据库(SQLite)以及...

    ios-一行代码持久化网络数据.zip

    在iOS开发中,数据持久化是一项重要的任务,它允许应用程序保存和恢复数据,即使应用关闭或设备重启。这个名为“ios-一行代码持久化网络数据.zip”的资源提供了一个简单而高效的解决方案,通过GitHub项目...

    iOS中几种数据持久化方案.pdf

    在iOS开发中,数据持久化是一项关键任务,它允许应用程序在退出或设备重启后仍然能够访问之前保存的数据。本文将详细介绍五种常见的iOS数据持久化方案:plist文件、偏好设置(Preference)、NSKeyedArchiver(归档)...

    IOS数据持久化的几种方式

    在iOS开发中,数据持久化是将应用程序中的数据保存到设备上以便在用户退出应用或设备重启后仍能访问的关键技术。本篇文章将详细介绍三种主要的数据持久化方法:SQLite(通过FMDB库)、Core Data以及Archiver(序列化...

    iphone 数据持久化的三个实例

    在iOS开发中,数据持久化是一项至关重要的技术,它使得应用程序的数据可以在用户关闭应用或设备重启后仍然保留。本文将通过三个具体的实例深入探讨iPhone上实现数据持久化的三种方法:属性列表、对象归档和SQLite3...

    iOS归档与解归档,持久化存储

    在iOS开发中,数据持久化是至关重要的一个环节,它使得应用在关闭或重启后仍能保留用户的数据。其中,归档与解归档是一种常用的数据持久化方式,特别是对于对象类型的复杂数据结构。本教程将深入探讨iOS的归档与解...

    iOS 数据持久性存储--属性列表存储

    注意,这种方法适用于结构简单的数据存储,如果数据结构复杂,可能需要考虑使用Core Data或者SQLite等更强大的数据持久化框架。属性列表存储虽然简单易用,但其性能和灵活性相对较弱,适合小规模、轻量级的数据管理...

    ios-手势解锁Demo,持久化本地存储.zip

    在iOS开发中,手势解锁是一种常见的用户验证方式,它提供了便捷的安全访问机制。这个"ios-手势解锁Demo,持久化本地存储.zip"压缩包包含了一个实现手势解锁功能的示例项目,同时也涉及到数据持久化这一关键概念。在这...

    iOS对FMDB进行封装实现数据持久化

    在iOS开发中,数据持久化是一项重要的任务,它允许应用程序在用户关闭或设备重启后仍然保存数据。FMDB是一个流行的选择,它是SQLite数据库的一个Objective-C封装库,提供了简单易用的接口来执行SQL语句。本篇文章将...

    IOS应用源码之数据持久性 .rar

    在iOS应用开发中,数据持久化是至关重要的一个环节,它使得应用可以在用户关闭或设备重启后仍能保存和恢复数据。"IOS应用源码之数据持久性 .rar"这个压缩包很可能包含了若干示例代码,用于演示如何在iOS应用中实现...

    iOS开发进阶-完整版

    - **数据持久化存储**: - Core Data框架详解:实体模型设计、数据增删改查操作。 - SQLite数据库:基本操作、查询优化技巧。 - UserDefaults:简单数据类型存储方法。 #### 三、高级主题与实践案例 - **多线程...

    ios开发之归档

    在iOS开发中,“归档”是一项关键的技术,用于持久化数据存储。归档允许开发者将对象的状态转换为字节流,然后保存到磁盘或通过网络传输,之后可以从这个字节流恢复对象。这一过程是Objective-C和Swift中的标准序列...

    iOS基础——数据存储之沙盒机制、Plist、Perference、归档、反归档

    归档和反归档是Objective-C提供的序列化技术,用于对象的持久化存储。利用NSKeyedArchiver和NSKeyedUnarchiver类,我们可以将对象编码为二进制数据(归档),然后在需要时解码回原对象(反归档)。这种方法适用于...

    iOS中几种数据持久化方案 --X枫林1

    在iOS开发中,数据持久化是一项重要的任务,它允许应用程序在退出或设备重启后仍然能够访问之前保存的数据。本文将详细介绍几种常见的数据持久化方案,包括plist文件、偏好设置、NSKeyedArchiver、SQLite 3以及...

    ios-SQLite数据库简易存储.zip

    在iOS开发中,数据持久化是一项重要的任务,用于在应用退出后保留用户数据或应用程序状态。SQLite是一个轻量级的、关系型的数据库管理系统,它被广泛应用于移动平台,包括iOS。"ios-SQLite数据库简易存储.zip" 文件...

    ios开发实用教材

    第三,书中还会介绍数据持久化,包括SQLite数据库、Core Data框架以及文件系统的使用,这些都是iOS应用存储和检索数据的重要手段。Core Data是一个强大的对象图形管理系统,能帮助开发者管理应用程序的数据模型。 ...

    XCode 数据持久化组件例题

    在iOS开发中,数据持久化是一项至关重要的技术,它使得应用程序可以保存用户数据并在下次启动时继续使用。XCode作为Apple官方的集成开发环境(IDE),提供了多种数据持久化的方法。本例题主要关注ORM(对象关系映射...

    ios开发基础教程

    教程会涵盖Core Data的基本用法,包括模型、上下文和持久化存储。你将了解到如何在应用程序中存储和检索数据,以及如何使用NSManagedObjects进行数据操作。 此外,教程还会涉及网络编程,包括HTTP请求、JSON解析...

    iOS开发进阶完整版 唐巧

    内容可能涵盖模型设计、关系建立、数据持久化、查询优化等。 4. **网络编程与API交互**:iOS应用往往需要与服务器进行数据交换,可能包含AFNetworking或URLSession的使用,JSON解析,RESTful API的设计原则,以及...

Global site tag (gtag.js) - Google Analytics