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

    PS:今天上午,非常郁闷,有很多简略基础的问题搞得我有些迷茫,哎,代码几天不写就忘。目前又不当COO,还是得用心记代码哦!

        一、文件操作

        

         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" 便可

        

              示例如下:

        


        

        /* { "aps": { "alert" : { "body" : "a msg come!" }, "bage": 3, "sound" : "def.mp3" } } */ NSString *strJson = @"{\"aps\":{\"alert\":{\"body\":\"a msg come!\"}, \"bage\":3, \"sound\":\"def.mp3\"}}"; // result中即为剖析出来的json文件,通过valueForKey便可读到相应的数据 NSDictionary *result = [strJson objectFromJSONString]; NSLog(@"%@", result); NSString *myJsonPath = [[NSBundlemainBundle] pathForResource:@"my"ofType:@"json"]; NSString *myJsonStr = [NSStringstringWithContentsOfFile:myJsonPath encoding:NSUTF8StringEncodingerror:nil]; NSLog(@"myJsonStr : %@", myJsonStr); NSDictionary *myResult = [myJsonStr objectFromJSONString]; NSLog(@"myJson : %@", myResult); // 生成json文件 NSMutableDictionary *jsonDic = [[NSMutableDictionarydictionary] autorelease]; NSMutableDictionary *alert = [[NSMutableDictionarydictionary] autorelease]; NSMutableDictionary *aps = [[NSMutableDictionarydictionary] autorelease]; [alert setObject:@"a msg come!"forKey:@"body"]; [aps setObject:alert forKey:@"alert"]; [aps setObject:@"3"forKey:@"bage"]; [aps setObject:@"def.mp3"forKey:@"sound"]; [jsonDic setObject:aps forKey:@"aps"]; 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中参加
    -(void)saveContext
    {
        NSError *error = nil;
        NSManagedObjectContext *managedObjectContext = self.managedObjectContext;
        if (managedObjectContext != nil) {
            if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) {
                NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
                abort();
            }
        }
    }
    
    #pragma mark - Core Data stack
    - (NSManagedObjectContext *)managedObjectContext
    {
        if (__managedObjectContext != nil) {
            return__managedObjectContext;
        }
       
        NSPersistentStoreCoordinator *coordinator = [selfpersisteneStoreCoordinator];
        if (coordinator != nil) {
            __managedObjectContext = [[NSManagedObjectContextalloc] init];
            [__managedObjectContextsetPersistentStoreCoordinator:coordinator];
        }
       
        return__managedObjectContext;
    }
    
    - (NSManagedObjectModel *)managedObjectModel
    {
        if (__managedObjectModel != nil) {
            return__managedObjectModel;
        }
       
        // 这里URLForResource:@"lich" 的名字(lich)要和你建立datamodel时候取的名字是一样的
        NSURL *modelURL = //[NSURL fileURLWithPath:[@"lich" stringByAppendingPathExtension:@"mom"]];
        [[NSBundlemainBundle] URLForResource:@"lich"withExtension:@"momd"];
        __managedObjectModel = [[NSManagedObjectModelalloc] initWithContentsOfURL:modelURL];
        return__managedObjectModel;
    }
    
    - (NSPersistentStoreCoordinator *)persisteneStoreCoordinator
    {
        if (__persistentStoreCoordinator != nil) {
            return__persistentStoreCoordinator;
        }
       
        NSString *docs = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
        NSURL *storURL = [NSURLfileURLWithPath:[docs stringByAppendingPathComponent:@"lich.sqlite"]];
       
        // 这个lich.sqlite名字无限制,就是一个数据库文件的名字
    //    NSURL *storeNRL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"lich.sqlite"];
    //    NSLog(@"storURL : %@", storeNRL);
    //    NSLog(@"store   : %@", storURL);
        NSError *error = nil;
        __persistentStoreCoordinator = [[NSPersistentStoreCoordinatoralloc] initWithManagedObjectModel:[selfmanagedObjectModel]];
        if (![__persistentStoreCoordinatoraddPersistentStoreWithType:NSSQLiteStoreTypeconfiguration:nilURL:storURL options:nilerror:&error]) {
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            abort();
        }
       
        return__persistentStoreCoordinator;
    }
    
    - (void)applicationWillTerminate:(UIApplication *)application
    {
        // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.
        [selfsaveContext];
    }



        


        

         4、在程序中使用
         

                 文件和数据
    文件和数据

    // 按保存按钮,保存数据
    - (void)addButtonPressed
    {
        [self.titleFieldresignFirstResponder];
        [self.ageFieldresignFirstResponder];
       
        Entity *entity = (Entity *) [NSEntityDescriptioninsertNewObjectForEntityForName:@"Entity"inManagedObjectContext:self.context];
        [entity setTitle:self.titleField.text];
        [entity setAge:[NSNumbernumberWithInt:[self.ageField.textintValue]]];
       
        NSError *error;
        BOOL isSaveSuccess = [self.contextsave:&error];
        if (isSaveSuccess) {
            NSLog(@"save successful!");
        } else {
            NSLog(@"Error : %@, %@ ", error, [error userInfo]);
        }
    }
    

    // 按查找按钮,掏出数据
    - (void)queryButtonPressed
    {
        // 创建取回数据请求
        NSFetchRequest *request = [[[NSFetchRequestalloc] init] autorelease];
        // 设置要检索的数据类型
        NSEntityDescription *des = [NSEntityDescriptionentityForName:@"Entity"inManagedObjectContext:self.context];
        // 设置请求实体
        [request setEntity:des];
        // 指定结果的排序方式
        NSSortDescriptor *sortDescriptor = [[[NSSortDescriptoralloc] initWithKey:@"age"ascending:NO] autorelease];
        NSArray *sortDescriptions = [[[NSArrayalloc] initWithObjects:sortDescriptor, nil] autorelease];
        [request setSortDescriptors:sortDescriptions];
       
        NSError *error  = nil;
        NSMutableArray *mutableFetchResult = [[self.contextexecuteFetchRequest:request error:&error] mutableCopy];
        if (mutableFetchResult == nil) {
            NSLog(@"Error : %@ , %@", error, [error userInfo]);
        }
       
        self.entities = mutableFetchResult;
        NSLog(@"The count of entry: %d", [self.entitiescount]);
       
        for (Entity *entity inself.entities) {
            NSLog(@"Title : %@ --------- Age: %d", entity.title, [entity.ageintValue]);
        }
       
        [mutableFetchResult release];
    }
    



    文章结束给大家分享下程序员的一些笑话语录: 人在天涯钻,哪儿能不挨砖?日啖板砖三百颗,不辞长做天涯人~

    --------------------------------- 原创文章 By
    文件和数据
    ---------------------------------

  • 相关阅读:
    RPC之总体架构
    Netty总结
    数据结构(2)
    数据结构(1)
    java初探(1)之秒杀项目总结
    java初探(1)之秒杀的安全
    java初探(1)之秒杀中的rabbitMQ
    java初探(1)之防止库存为负以及防超买
    java初探(1)之静态页面化——客户端缓存
    java初探(1)之缓存技术
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3108959.html
Copyright © 2011-2022 走看看