文件数据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
文件和数据
---------------------------------

posted @ 2013-05-30 20:19  坚固66  阅读(255)  评论(0编辑  收藏  举报