iOS中的数据持久化方式,基本上有以下四种:属性列表、对象归档、SQLite3和Core Data。
1.属性列表
  涉及到的主要类:NSUserDefaults,一般 [NSUserDefaults standardUserDefaults]就够用了
  @interface User : NSObject <NSCoding>
  @property (nonatomic, assign) NSInteger userID;
  @property (nonatomic, copy) NSString *name;
  @end
  使用方法
  1).分开存取
  // 存
  [[NSUserDefaults standardUserDefaults] setInteger:userID forKey:@”userID”];
  [[NSUserDefaults standardUserDefaults] setObject:name forKey:@”name”];
  // 取
  NSInteger uId = [[[NSUserDefaults standardUserDefaults] integerValueForKey:@”userID”];
  NSString* name = [[NSUserDefaults standardUserDefaults] stringForKey:@”name”];
2.对象归档
  要使用对象归档,对象必须实现NSCoding协议.大部分Object C对象都符合NSCoding协议,也可以在自定义对象中实现NSCoding协议,要实现NSCoding协议,实现两个方法:
  - (void) encodeWithCoder:(NSCoder *)encoder 与 -(void)initWithCoder:(NSCoder *)encoder
  同时,建议对象也同时实现NSCopying协议,该协议允许复制对象,要实现NSCopying协议须实现 -(id)copyWithZone:(NSZone *)zone 方法 。
  @interface User : NSObject <NSCoding>
  @property (nonatomic, assign) NSInteger userID;
  @property (nonatomic, copy) NSString *name;
  @end
  @implementation User
  // 以下两个方法一定要实现,不然在调用的时候会crash
  - (void)encodeWithCoder:(NSCoder *)aCoder;
  {
  // 这里放置需要持久化的属性
  [aCoder encodeObject:[NSNumber numberWithInteger:self.userID] forKey:@”userID”];
  [aCoder encodeObject:self.name forKey:@"name"];
  }
  - (id)initWithCoder:(NSCoder *)aDecoder
  {
  if (self = [self init])
  {
  // 这里务必和encodeWithCoder方法里面的内容一致,不然会读不到数据
  self.userID = [[aDecoder decodeObjectForKey:@"userID"] integerValue];
  self.name = [aDecoder decodeObjectForKey:@"name"];
  }
  return self;
  }
  // 使用方法
  + (BOOL)save {
  NSError *error = nil;
  // 确定存储路径,一般是Document目录下的文件
  NSString* fileName = [self getFileName];
  NSString* filePath = [self getFilePath];
  if (![[NSFileManager defaultManager] createDirectoryAtPath:filePath withIntermediateDirectories:YES attributes:nil error:&error]) {
  NSLog(@”创建用户文件目录失败”);
  return NO;
  }
  return [NSKeyedArchiver archiveRootObject:self toFile:[fileName:userId]];
  }
  @end
3.SQLite3
  SQLite是一个开源的嵌入式关系数据库,它在2000年由D. Richard Hipp发布,它的减少应用程序管理数据的开销,SQLite可移植性好,很容易使用,很小,高效而且可靠。
  SQLite嵌入到使用它的应用程序中,它们共用相同的进程空间,而不是单独的一个进程。从外部看,它并不像一个RDBMS,但在进程内部,它却是完整的,自包含的数据库引擎。 嵌入式数据库的一大好处就是在你的程序内部不需要网络配置,也不需要管理。因为客户端和服务器在同一进程空间运行。SQLite 的数据库权限只依赖于文件系统,没有用户帐户的概念。SQLite 有数据库级锁定,没有网络服务器。它需要的内存,其它开销很小,适合用于嵌入式设备。你需要做的仅仅是把它正确的编译到你的程序。
  关于SQLite的开发资料较多,这里不再细说。只是建议不直接操作SQLite库,而是采用一些开源的第三方库来进行操作。
  对SQLite都做了不错的封装。   4.Core Data
  Core Data本质上是使用SQLite保存数据,但是它不需要编写任何SQL语句。   要使用Core Data,需要在Xcode中的数据模型编辑器中设计好各个实体以及定义好他们的属性和关系。之后,通过操作这些对象,结合Core Data完成数据的持久化:   NSManagedObjectContext *context = [appDelegate managedObjectContext];
  NSError *error;
  NSString *fieldName = [NSString stringWithFormat:@"test%d", i];
  UITextField *theField = [self valueForKey:fieldName];
  NSFetchRequest *request = [[NSFetchRequest alloc] init];
  //创 建描述语句,需求Line对象。类似于在数据库中限定为Line表。
  NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Line" inManagedObjectContext:context];
  [request setEntity:entityDescription];
  //创建限制性语句,类似于SQL语句中的 where lineNum = i
  NSPredicate *pred = [NSPredicate predicateWithFormat:@"(lineNum = %d)", i];
  [request setPredicate:pred];
  NSManagedObject *theLine = nil;
  NSArray *objects = [context executeFetchRequest:request error:&error];
  if (objects == nil){
  NSLog(@”There was an error!”);
  // Do whatever error handling is appropriate
  }
  if ([objects count] > 0){ //如果符合条件的object存在,则取出
  theLine = [objects objectAtIndex:0];
  }
  else { //如果不存在,则插入一个新的.
  theLine = [NSEntityDescription insertNewObjectForEntityForName:@"Line"
  inManagedObjectContext:context];
  [theLine setValue:[NSNumber numberWithInt:i] forKey:@”lineNum”]; //设置这个object的属性,coredata会自动将其写入sqlite
  [theLine setValue:theField.text forKey:@"lineText"];
  [request release];
  }
  }   下面是其取数据的过程:   Core_Data_PersistenceAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
  NSManagedObjectContext *context = [appDelegate managedObjectContext];
  NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Line"
  inManagedObjectContext:context];
  NSFetchRequest *request = [[NSFetchRequest alloc] init];
  [request setEntity:entityDescription];
  NSError *error;
  NSArray *objects = [context executeFetchRequest:request error:&error];
  if (objects == nil)
  {
  NSLog(@”There was an error!”);
  // Do whatever error handling is appropriate
  }
  //每一个对象在CoreData中都表示为一个NSManagedObject对象(类似于数据库表中的每一行),他的属性通过键/值 方式获取
  for (NSManagedObject *oneObject in objects)
  {
  NSNumber *lineNum = [oneObject valueForKey:@"lineNum"];
  NSString *lineText = [oneObject valueForKey:@"lineText"];
  }
  [request release];
												

iOS中的数据持久化方式的更多相关文章

  1. IOS学习:ios中的数据持久化初级(文件、xml、json、sqlite、CoreData)

    IOS学习:ios中的数据持久化初级(文件.xml.json.sqlite.CoreData) 分类: ios开发学习2013-05-30 10:03 2316人阅读 评论(2) 收藏 举报 iOSX ...

  2. ios中常见数据存储方式以及SQLite常用的语句

    在iOS中,根据不同的需求对应的有多种数据存储方式: 1.NSUserdefaults  将数据存储到沙盒中(library),方便易用,但是只能存储系统提供的数据类型(plist),不能存储自定义的 ...

  3. IOS中的数据存储方式,特点,使用情况

    数据存储的核心都是写文件,主要有四种持久化方式:属性列表(Plist),对象序列化,SQLite数据库,CoreData. 存储Plist: 键值进行存储,不能存储对象.对象需要序列化编码才能写入文件 ...

  4. iOS中的数据存储方式_SQLite3

    优点: 1) SQLite是一款轻型的嵌入式数据库; 2) 它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了 3) 它的处理速度比Mysql.PostgreSQL这两款著名的数据库都还 ...

  5. iOS中的数据存储方式_Preference(NSUserDefaults)

    NSUserDefaults适合存储轻量级的本地数据,项目中,我会把一些简单的数据密码.网址.登陆状态BOOL.整型/浮点型数据等和用户有关的数据用它存储.但是它不能存储自定义的对象! 实例化一个 N ...

  6. iOS中的数据存储方式_Plist

    plist文件只能存储OC常用数据类型(NSString.NSDictionary.NSArray.NSData.NSNumber等类型)而不能直接存储自定义模型对象; 我们拿NSData举例: /* ...

  7. iOS开发中的4种数据持久化方式【二、数据库 SQLite3、Core Data 的运用】

                   在上文,我们介绍了ios开发中的其中2种数据持久化方式:属性列表.归档解档.本节将继续介绍另外2种iOS持久化数据的方法:数据库 SQLite3.Core Data 的运 ...

  8. iOS开发中的4种数据持久化方式【一、属性列表与归档解档】

    iOS中的永久存储,也就是在关机重新启动设备,或者关闭应用时,不会丢失数据.在实际开发应用时,往往需要持久存储数据的,这样用户才能在对应用进行操作后,再次启动能看到自己更改的结果与痕迹.ios开发中, ...

  9. iOS数据持久化方式及class_copyIvarList与class_copyPropertyList的区别

    iOS数据持久化方式:plist文件(属性列表)preference(偏好设置)NSKeyedArchiver(归档)SQLite3CoreData沙盒:iOS程序默认情况下只能访问自己的程序目录,这 ...

随机推荐

  1. FolderSync PC 电脑 FTP 同步方法

    1.PC上用IIS搭建一个FTP即可,用电脑上的FTP软件测试通过即可(有可能在FTP软件帐号管理中,要选 “主动”模式) 2.FolderSync 建立FTP帐户后,要选“旧版库”(帐户页面最下方) ...

  2. 初探Spring Batch

    此系列博客皆为学习Spring Batch时的一些笔记: 为什么我们需要批处理? 我们不会总是想要立即得到需要的信息,批处理允许我们在请求处理之前就一个既定的流程开始搜集信息:比如说一个银行对账单,我 ...

  3. DOM的基本属性

    结构和内容属性1.1 nodeType1.2 nodeName, tagName1.3 innerHTML1.4 innerHTML pitFalls1.5 nodeValue 总结DOM节点是一个对 ...

  4. c#控制台調用SSIS包互传值

    有时候不仅仅需要在内部执行package包,多数情况下,是需要在外部进行调用,比如,需要一个批处理或者控制台程序进行外部调用SSIS包,而往往这个包所配置的连接字符串是经过加密处理的,所以当外部调用S ...

  5. 搭建基于Jenkins salt-api的运维工具

    1. 安装salt-master和salt-minion 安装过程不再赘述,请参考http://docs.saltstack.com/en/latest/topics/installation/ind ...

  6. CC_STACKPROTECTOR防内核堆栈溢出补丁分析【转】

    转自:https://yq.aliyun.com/articles/1723 摘要: 作者:王智通   CC_STACKPROTECT补丁是Tejun Heo在09年给主线kernel提交的一个用来防 ...

  7. Ubuntu 16.04环境布署小记

    本系列文章记录了升级Ubuntu 16.04的布署过程 回到目录 10. 安装Mono, Xsp 当前版本16.04.1的系统源的Mono版本为4.2.1,如需使用最新版本(本文书写时稳定版本为4.6 ...

  8. OC-《购票系统》

    来个命令行的购票系统 --1-- 需求分析 1.1 分析 1.2 功能分析 1.3 流程分析 --2-- 原型展示 2.1 界面原型 --3-- 系统设计 3.1 类设计 3.2 框架模块设计 --4 ...

  9. webapi mvc session一直获取不到问题

    前一段时间在给移动端写接口时遇到一个调用接口发送邮箱 session 一直获取不到的问题.我来给遇到问题的同志们说一说 自个在网上查了好多资料,问了一些朋友后.终于找到解决方案了. 大家都知道weba ...

  10. [LeetCode_3] Longest Substring Without Repeating Characters

    LeetCode: 3. Longest Substring Without Repeating Characters class Solution { public: int lengthOfLon ...