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

时间:2022-12-09 19:06:20
分类: ios开发学习2013-05-30 10:03 2316人阅读 评论(2) 收藏 举报
一、文件操作
     1、因为应用是在沙盒(Sandbox)中的,在文件读写权限上受到限制,只能在几个目录下读写文件:
          * Documents:应用中用户数据可以放在这里,iTunes备份和恢复的时候会包括此目录
          * tmp:存放临时文件,iTunes不会备份和恢复此目录,此目录下文件可能会在应用退出后删除
          * Library/Caches:存放缓存文件,iTunes不会备份此目录,此目录下的文件不会在应用退出删除
    2、相关方法:
       # 使用NSSearchPathForDiretoriesInDomains()方法只能定位Caches目录和Documents目录
            NSArray *paths = NSSearchPathForDiretoriesInDomains(NSCachesDirectory,           NSUserDomainMask, YES)
       # NSHomeDirectory();可以取得应用的根目录
            e.g 通过home取tmp目录
            NSString *fileName = [NSHomeDirectory()           stringByAppendingPathComponent:@"tmp/myFile.txt"];
       # 使用资源文件:
       # 应用安装到设备上后,资源文件是在app(即home目录)目录下的
       e.g 获取资源文件
       NSString *filePath = [[NSBundle mainBundle] pathForResourcce:@"f" ofType:@"txt"];
       NSStirng *fileContent = [[NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error nil];
 
       # 写入文件:
 

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

    }
二、sqlite

/* sqlite的方法
      * 1、sqlite3        *db,数据库句柄,跟文件句柄FILE很类似
      * 2、sqlite3_stmt   *stmt,这个相当于ODBC的Command对象,用于保存编译好的SQL语句
      * 3、sqlite3_open() 打开数据库,没有数据库时创建
      * 4、sqlite3_exec() 执行非查询的sql语句
      * 5、Sqlite3_step() 在调用sqlite3_prepare后,使用这个函数在记录集中移动
      * 6、sqlite3_close()关闭数据库
      *
      * 还有一系列用于从记录集字段中获取数据,e.g
      * 1、sqlite3_column_text()  取text类型的数据
      * 2、sqlite3_column_blob()  取blob类型数据
      * 3、sqlite3_column_int()   取int类型数据
 
 
      * 数据库操作要添加  libsqlite3.dylib  静态库
      * 包含头文件: import "sqlite3.h"
      */

            IOS学习:ios中的数据持久化初级(文件、xml、json、sqlite、CoreData)   
            IOS学习:ios中的数据持久化初级(文件、xml、json、sqlite、CoreData)      
 
            IOS学习:ios中的数据持久化初级(文件、xml、json、sqlite、CoreData)    
 
            IOS学习:ios中的数据持久化初级(文件、xml、json、sqlite、CoreData)
 
            IOS学习:ios中的数据持久化初级(文件、xml、json、sqlite、CoreData)
 
三、xml
 
     xml解析:采用系统自带的NSXMLParser进行xml文件的解析,解析是同步的,所以要放到dispatch_async()中进行异步处理,解析类实现NSXMLParserDelegate代理,解析完成后会调相应的代理方法。
     
     简单介绍几个方法:

// 开始解析某个元素时调用的方法
- (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict;

     用attributeDict的valueForKey方法可以得到相应属性的值
     

// 解析完一个元素时回调的方法

- (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI qualifiedName:(NSString *)qName;
 
     // 解析到元素之间的字符串时调用的方法 e.g <name>wusj</name>    --->wusj

- (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string;

 
xml解析主要是代理,会代理设计模式,跟android中的xml解析就一样,没有太大区别。如果不理解,应该先看下代理设计模式,能看到这,代理设计模式应该已经很熟悉了。
 
 
四、JSONKit解析json文件
   JSONKit库是一个第三方的json解析库,ios5之前iOS并没有自带的json解析类库,ios5后有了自己的json解析类库,而且解析效率好。所以如果
只要兼容到ios5应该用系统自带的json解析,如果要支持ios4,则可以用JSONKit,JSONKit效率高,还可以兼容ios4,是一个不错的选择。(跟android的一比,这封装啥都不用干就帮你搞好了,唉)
     开源Github地址:https://github.com/johnezang/JSONKit
下载后,将JSONKit.h和JSONKit.m文件拷贝到工程中,使用的时候导入头文件 #import "JSONKit.h" 即可
          示例如下:
 
  1. /*
  2. {
  3. "aps":
  4. {
  5. "alert" :
  6. {
  7. "body" : "a msg come!"
  8. },
  9. "bage": 3,
  10. "sound" : "def.mp3"
  11. }
  12. }
  13. */
  14. NSString *strJson = @"{\"aps\":{\"alert\":{\"body\":\"a msg come!\"}, \"bage\":3, \"sound\":\"def.mp3\"}}";
  15. // result中即为解析出来的json文件,通过valueForKey即可读到相应的数据
  16. NSDictionary *result = [strJson objectFromJSONString];
  17. NSLog(@"%@", result);
  18. NSString *myJsonPath = [[NSBundlemainBundle] pathForResource:@"my"ofType:@"json"];
  19. NSString *myJsonStr = [NSStringstringWithContentsOfFile:myJsonPath encoding:NSUTF8StringEncodingerror:nil];
  20. NSLog(@"myJsonStr : %@", myJsonStr);
  21. NSDictionary *myResult = [myJsonStr objectFromJSONString];
  22. NSLog(@"myJson : %@", myResult);
  23. // 生成json文件
  24. NSMutableDictionary *jsonDic = [[NSMutableDictionarydictionary] autorelease];
  25. NSMutableDictionary *alert = [[NSMutableDictionarydictionary] autorelease];
  26. NSMutableDictionary *aps = [[NSMutableDictionarydictionary] autorelease];
  27. [alert setObject:@"a msg come!"forKey:@"body"];
  28. [aps setObject:alert forKey:@"alert"];
  29. [aps setObject:@"3"forKey:@"bage"];
  30. [aps setObject:@"def.mp3"forKey:@"sound"];
  31. [jsonDic setObject:aps forKey:@"aps"];
  32. NSString *jsonStr = [jsonDic JSONString];
 
五、CoreData
刚接触ios不久,对CoreData不熟悉,第一次GOOGLE学习CoreData结果如下,说实话还是有好多不明白的地方,等以后慢慢了解吧。。
     在现有的工程中加入CoreData支持
     1、在new file中建一个Data Model
          选中列表中新建的Data model点击下方的Add Entity新建一个实体,选中实体给实体添加相应的Attributes
          给实体生成对应的oc类:选中实体,点击Editor菜单 ----》Create NSManagedObject Subclass即生成了相应的实体类
     2、在AppDelegate.h中加入
              @property (nonatomic, retain, readonly) NSManagedObjectContext *managedObjectContext;

@property (nonatomic, retain, readonly) NSManagedObjectModel *managedObjectModel;
       @property (nonatomic, retain, readonly) NSPersistentStoreCoordinator *persisteneStoreCoordinator;

- (void)saveContext;
       - (NSURL *)applicationDocumentsDirectory;

   3、在AppDelegate.m中加入
  1. -(void)saveContext
  2. {
  3. NSError *error = nil;
  4. NSManagedObjectContext *managedObjectContext = self.managedObjectContext;
  5. if (managedObjectContext != nil) {
  6. if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) {
  7. NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
  8. abort();
  9. }
  10. }
  11. }
  12. #pragma mark - Core Data stack
  13. - (NSManagedObjectContext *)managedObjectContext
  14. {
  15. if (__managedObjectContext != nil) {
  16. return__managedObjectContext;
  17. }
  18. NSPersistentStoreCoordinator *coordinator = [selfpersisteneStoreCoordinator];
  19. if (coordinator != nil) {
  20. __managedObjectContext = [[NSManagedObjectContextalloc] init];
  21. [__managedObjectContextsetPersistentStoreCoordinator:coordinator];
  22. }
  23. return__managedObjectContext;
  24. }
  25. - (NSManagedObjectModel *)managedObjectModel
  26. {
  27. if (__managedObjectModel != nil) {
  28. return__managedObjectModel;
  29. }
  30. // 这里URLForResource:@"lich" 的名字(lich)要和你建立datamodel时候取的名字是一样的
  31. NSURL *modelURL = //[NSURL fileURLWithPath:[@"lich" stringByAppendingPathExtension:@"mom"]];
  32. [[NSBundlemainBundle] URLForResource:@"lich"withExtension:@"momd"];
  33. __managedObjectModel = [[NSManagedObjectModelalloc] initWithContentsOfURL:modelURL];
  34. return__managedObjectModel;
  35. }
  36. - (NSPersistentStoreCoordinator *)persisteneStoreCoordinator
  37. {
  38. if (__persistentStoreCoordinator != nil) {
  39. return__persistentStoreCoordinator;
  40. }
  41. NSString *docs = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
  42. NSURL *storURL = [NSURLfileURLWithPath:[docs stringByAppendingPathComponent:@"lich.sqlite"]];
  43. // 这个lich.sqlite名字无限制,就是一个数据库文件的名字
  44. //    NSURL *storeNRL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"lich.sqlite"];
  45. //    NSLog(@"storURL : %@", storeNRL);
  46. //    NSLog(@"store   : %@", storURL);
  47. NSError *error = nil;
  48. __persistentStoreCoordinator = [[NSPersistentStoreCoordinatoralloc] initWithManagedObjectModel:[selfmanagedObjectModel]];
  49. if (![__persistentStoreCoordinatoraddPersistentStoreWithType:NSSQLiteStoreTypeconfiguration:nilURL:storURL options:nilerror:&error]) {
  50. NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
  51. abort();
  52. }
  53. return__persistentStoreCoordinator;
  54. }
  55. - (void)applicationWillTerminate:(UIApplication *)application
  56. {
  57. // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
  58. [selfsaveContext];
  59. }
 
 
     4、在程序中使用
 
            IOS学习:ios中的数据持久化初级(文件、xml、json、sqlite、CoreData)
IOS学习:ios中的数据持久化初级(文件、xml、json、sqlite、CoreData)
 
  1. // 按保存按钮,保存数据
  2. - (void)addButtonPressed
  3. {
  4. [self.titleFieldresignFirstResponder];
  5. [self.ageFieldresignFirstResponder];
  6. Entity *entity = (Entity *) [NSEntityDescriptioninsertNewObjectForEntityForName:@"Entity"inManagedObjectContext:self.context];
  7. [entity setTitle:self.titleField.text];
  8. [entity setAge:[NSNumbernumberWithInt:[self.ageField.textintValue]]];
  9. NSError *error;
  10. BOOL isSaveSuccess = [self.contextsave:&error];
  11. if (isSaveSuccess) {
  12. NSLog(@"save successful!");
  13. } else {
  14. NSLog(@"Error : %@, %@ ", error, [error userInfo]);
  15. }
  16. }
  1. // 按查找按钮,取出数据
  2. - (void)queryButtonPressed
  3. {
  4. // 创建取回数据请求
  5. NSFetchRequest *request = [[[NSFetchRequestalloc] init] autorelease];
  6. // 设置要检索的数据类型
  7. NSEntityDescription *des = [NSEntityDescriptionentityForName:@"Entity"inManagedObjectContext:self.context];
  8. // 设置请求实体
  9. [request setEntity:des];
  10. // 指定结果的排序方式
  11. NSSortDescriptor *sortDescriptor = [[[NSSortDescriptoralloc] initWithKey:@"age"ascending:NO] autorelease];
  12. NSArray *sortDescriptions = [[[NSArrayalloc] initWithObjects:sortDescriptor, nil] autorelease];
  13. [request setSortDescriptors:sortDescriptions];
  14. NSError *error  = nil;
  15. NSMutableArray *mutableFetchResult = [[self.contextexecuteFetchRequest:request error:&error] mutableCopy];
  16. if (mutableFetchResult == nil) {
  17. NSLog(@"Error : %@ , %@", error, [error userInfo]);
  18. }
  19. self.entities = mutableFetchResult;
  20. NSLog(@"The count of entry: %d", [self.entitiescount]);
  21. for (Entity *entity inself.entities) {
  22. NSLog(@"Title : %@ --------- Age: %d", entity.title, [entity.ageintValue]);
  23. }
  24. [mutableFetchResult release];
  25. }

IOS学习:ios中的数据持久化初级(文件、xml、json、sqlite、CoreData)的更多相关文章

  1. iOS中的数据持久化方式

    iOS中的数据持久化方式,基本上有以下四种:属性列表.对象归档.SQLite3和Core Data. 1.属性列表 涉及到的主要类:NSUserDefaults,一般 [NSUserDefaults ...

  2. iOS面试题--Model层--数据持久化储存方案

    数据持久化储存方案有哪些? iOS中的数据持久化方式,基本上有以下四种:属性列表.对象归档.SQLite3和Core Data 1.属性列表涉及到的主要类:NSUserDefaults,一般 [NSU ...

  3. 关于iOS去除数组中重复数据的几种方法

    关于iOS去除数组中重复数据的几种方法   在工作工程中我们不必要会遇到,在数组中有重复数据的时候,如何去除重复的数据呢? 第一种:利用NSDictionary的AllKeys(AllValues)方 ...

  4. IOS学习:常用第三方库(GDataXMLNode:xml解析库)

    IOS学习:常用第三方库(GDataXMLNode:xml解析库) 解析 XML 通常有两种方式,DOM 和 SAX: DOM解析XML时,读入整个XML文档并构建一个驻留内存的树结构(节点树),通过 ...

  5. iOS学习——iOS原生实现二维码扫描

    最近项目上需要开发扫描二维码进行签到的功能,主要用于开会签到的场景,所以为了避免作弊,我们再开发时只采用直接扫描的方式,并且要屏蔽从相册读取图片,此外还在二维码扫描成功签到时后台会自动上传用户的当前地 ...

  6. Android中的数据持久化机制

    Android中几种最简单但是却最通用的数据持久化技术:SharedPreference.实例状态Bundle和本地文件. Android的非确定性Activity和应用程序生存期使在会话间保留UI状 ...

  7. redis学习(九)——数据持久化

    一.概述 Redis的强大性能很大程度上都是因为所有数据都是存储在内存中的,然而当Redis重启后,所有存储在内存中的数据将会丢失,在很多情况下是无法容忍这样的事情的.所以,我们需要将内存中的数据持久 ...

  8. C&num; 将List中的数据导入csv文件中

    //http://www.cnblogs.com/mingmingruyuedlut/archive/2013/01/20/2849906.html C# 将List中的数据导入csv文件中   将数 ...

  9. Python3 Pandas的DataFrame格式数据写入excle文件、json、html、剪贴板、数据库

    Python3 Pandas的DataFrame格式数据写入excle文件.json.html.剪贴板.数据库 一.DataFrame格式数据 Pandas是Python下一个开源数据分析的库,它提供 ...

随机推荐

  1. 初试Nodejs——使用keystonejs创建博客网站2(修改模板)

    上一篇(初试Nodejs——使用keystonejs创建博客网站1(安装keystonejs))讲了keystonejs的安装.安装完成后,已经具备了基本的功能,我们需要对页面进行初步修改,比如,增加 ...

  2. Entity Framework在Asp&period;net MVC中的实现One Context Per Request&lpar;附源码&rpar;

    上篇中"Entity Framework中的Identity map和Unit of Work模式", 由于EF中的Identity map和Unit of Work模式,EF体现 ...

  3. mysql-case &period;&period;&period; when&period;&period;&period;then&period;&period;&period;else&period;&period;&period;end处理判断赋值机制

    then jrkp else zrspj end ))/(case zrspj then jrkp else zrspj end ) zdf from hqxg order by zdf LIMIT ...

  4. nova分析(7)—— nova-scheduler

    Nova-Scheduler主要完成虚拟机实例的调度分配任务,创建虚拟机时,虚拟机该调度到哪台物理机上,迁移时若没有指定主机,也需要经过scheduler.资源调度是云平台中的一个很关键问题,如何做到 ...

  5. Delegate&amp&semi;Event

    Delegate 1.基本类: public class Student { public int Id { get; set; } public string Name { get; set; } ...

  6. &lbrack;Interview&rsqb;&lbrack;CodingExam&rsqb;

    這次去Interview, 其中有一個公司 把我列為 2/25的考慮對象, 在Final 的 1/2, 我被刷掉了. 因為第一輪的程式,我稍微google了一下,參考了既有的寫法. 即使第二輪我用完全 ...

  7. (转载)delphi 中如何调用sql 存储过程

    delphi 中如何调用sql 存储过程 使用TADOStoredProc组件,可以,给你举个例子好了 with ADOStoredProc1 do begin Close; Parameters.C ...

  8. 数据可视化-使用EXCEL和PS制作一个复杂饼图

    一个朋友让我帮忙用饼图去展现一下一堆数据,我说行,后来他给我后,我看到是一堆貌似从什么仪器中导出的一堆使用分隔符分开的文本文档,使用excel打开后如下(为了保护隐私忽略了用字母和数字代替原来的内容: ...

  9. CSS vertical-align属性

    之前也经常用到vertical-align进行垂直居中对齐,突然发现其中的一些属性值根本就没使用过,也不清楚效果,将今天的研究成果记录下. vertical-align 属性 下表是w3c上列举的属性 ...

  10. Selenium2 &lpar;python&rpar;

    包名:selenium 支持浏览器:Firefox,InternetExplorerDriver,OperaDriver,Chrome(要使用一种浏览器应下载相应的driver驱动) 一.基本命令 d ...