zoukankan      html  css  js  c++  java
  • IOS学习:ios中的数据持久化初级(文件、xml、json、sqlite、CoreData)

     

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

    分类: ios开发学习
    一、文件操作
         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];
     
           # 写入文件:
     
             ;
        }
         
    二、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"
          */
                   
                      
     
                    
     
                
     
                
     
    三、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.     
    19.     
    20.    NSString *myJsonPath = [[NSBundlemainBundle] pathForResource:@"my"ofType:@"json"];  
    21.    NSString *myJsonStr = [NSStringstringWithContentsOfFile:myJsonPath encoding:NSUTF8StringEncodingerror:nil];  
    22.    NSLog(@"myJsonStr : %@", myJsonStr);  
    23.    NSDictionary *myResult = [myJsonStr objectFromJSONString];  
    24.    NSLog(@"myJson : %@", myResult);  
    25.     
    26.      // 生成json文件  
    27.    NSMutableDictionary *jsonDic = [[NSMutableDictionarydictionary] autorelease];  
    28.    NSMutableDictionary *alert = [[NSMutableDictionarydictionary] autorelease];  
    29.    NSMutableDictionary *aps = [[NSMutableDictionarydictionary] autorelease];  
    30.    [alert setObject:@"a msg come!"forKey:@"body"];  
    31.    [aps setObject:alert forKey:@"alert"];  
    32.    [aps setObject:@"3"forKey:@"bage"];  
    33.    [aps setObject:@"def.mp3"forKey:@"sound"];  
    34.    [jsonDic setObject:aps forKey:@"aps"];  
    35.    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.   
    13. #pragma mark - Core Data stack  
    14. - (NSManagedObjectContext *)managedObjectContext  
    15. {  
    16.     if (__managedObjectContext != nil) {  
    17.         return__managedObjectContext;  
    18.     }  
    19.      
    20.     NSPersistentStoreCoordinator *coordinator = [selfpersisteneStoreCoordinator];  
    21.     if (coordinator != nil) {  
    22.         __managedObjectContext = [[NSManagedObjectContextalloc] init];  
    23.         [__managedObjectContextsetPersistentStoreCoordinator:coordinator];  
    24.     }  
    25.      
    26.     return__managedObjectContext;  
    27. }  
    28.   
    29. - (NSManagedObjectModel *)managedObjectModel  
    30. {  
    31.     if (__managedObjectModel != nil) {  
    32.         return__managedObjectModel;  
    33.     }  
    34.      
    35.     // 这里URLForResource:@"lich" 的名字(lich)要和你建立datamodel时候取的名字是一样的  
    36.     NSURL *modelURL = //[NSURL fileURLWithPath:[@"lich" stringByAppendingPathExtension:@"mom"]];  
    37.     [[NSBundlemainBundle] URLForResource:@"lich"withExtension:@"momd"];  
    38.     __managedObjectModel = [[NSManagedObjectModelalloc] initWithContentsOfURL:modelURL];  
    39.     return__managedObjectModel;  
    40. }  
    41.   
    42. - (NSPersistentStoreCoordinator *)persisteneStoreCoordinator  
    43. {  
    44.     if (__persistentStoreCoordinator != nil) {  
    45.         return__persistentStoreCoordinator;  
    46.     }  
    47.      
    48.     NSString *docs = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];  
    49.     NSURL *storURL = [NSURLfileURLWithPath:[docs stringByAppendingPathComponent:@"lich.sqlite"]];  
    50.      
    51.     // 这个lich.sqlite名字无限制,就是一个数据库文件的名字  
    52. //    NSURL *storeNRL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"lich.sqlite"];  
    53. //    NSLog(@"storURL : %@", storeNRL);  
    54. //    NSLog(@"store   : %@", storURL);  
    55.     NSError *error = nil;  
    56.     __persistentStoreCoordinator = [[NSPersistentStoreCoordinatoralloc] initWithManagedObjectModel:[selfmanagedObjectModel]];  
    57.     if (![__persistentStoreCoordinatoraddPersistentStoreWithType:NSSQLiteStoreTypeconfiguration:nilURL:storURL options:nilerror:&error]) {  
    58.         NSLog(@"Unresolved error %@, %@", error, [error userInfo]);  
    59.         abort();  
    60.     }  
    61.      
    62.     return__persistentStoreCoordinator;  
    63. }  
    64.   
    65. - (void)applicationWillTerminate:(UIApplication *)application  
    66. {  
    67.     // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.  
    68.     [selfsaveContext];  
    69. }  


     
     
         4、在程序中使用
         
     
                
     
    1. // 按保存按钮,保存数据  
    2. - (void)addButtonPressed  
    3. {  
    4.     [self.titleFieldresignFirstResponder];  
    5.     [self.ageFieldresignFirstResponder];  
    6.      
    7.     Entity *entity = (Entity *) [NSEntityDescriptioninsertNewObjectForEntityForName:@"Entity"inManagedObjectContext:self.context];  
    8.     [entity setTitle:self.titleField.text];  
    9.     [entity setAge:[NSNumbernumberWithInt:[self.ageField.textintValue]]];  
    10.      
    11.     NSError *error;  
    12.     BOOL isSaveSuccess = [self.contextsave:&error];  
    13.     if (isSaveSuccess) {  
    14.         NSLog(@"save successful!");  
    15.     } else {  
    16.         NSLog(@"Error : %@, %@ ", error, [error userInfo]);  
    17.     }  
    18. }  

    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.      
    15.     NSError *error  = nil;  
    16.     NSMutableArray *mutableFetchResult = [[self.contextexecuteFetchRequest:request error:&error] mutableCopy];  
    17.     if (mutableFetchResult == nil) {  
    18.         NSLog(@"Error : %@ , %@", error, [error userInfo]);  
    19.     }  
    20.      
    21.     self.entities = mutableFetchResult;  
    22.     NSLog(@"The count of entry: %d", [self.entitiescount]);  
    23.      
    24.     for (Entity *entity inself.entities) {  
    25.         NSLog(@"Title : %@ --------- Age: %d", entity.title, [entity.ageintValue]);  
    26.     }  
    27.      
    28.     [mutableFetchResult release];  
    29. }  
  • 相关阅读:
    Linux学习——在虚拟机上的Linux进行磁盘分区
    Linux命令学习3——用户管理
    linux 命令学习2
    linux 命令学习1——tr命令
    基于netty的一个简单的时间服务器的实现(netty学习)
    JavaNIO
    JavaNIO中的内存映射io
    打造高效的工作环境 – SHELL 篇
    linux下怎么清理缓存
    清理系统缓存
  • 原文地址:https://www.cnblogs.com/iOS-mt/p/4172473.html
Copyright © 2011-2022 走看看