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

一、文件操作
     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"
      */
             IOS学习:ios中的数据持久化初级(文件、xml、json、sqlite、CoreData)_第1张图片    
             IOS学习:ios中的数据持久化初级(文件、xml、json、sqlite、CoreData)_第2张图片      

             IOS学习:ios中的数据持久化初级(文件、xml、json、sqlite、CoreData)_第3张图片    

             IOS学习:ios中的数据持久化初级(文件、xml、json、sqlite、CoreData)_第4张图片

             IOS学习:ios中的数据持久化初级(文件、xml、json、sqlite、CoreData)_第5张图片

三、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、在程序中使用
     

             IOS学习:ios中的数据持久化初级(文件、xml、json、sqlite、CoreData)_第6张图片


// 按保存按钮,保存数据
- (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];
}



你可能感兴趣的:(ios,xml,json,sqlite,coredata)