首页 > 代码库 > (转)iOS XML JSON SQLite CoreData 数据持久化

(转)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"
      */
               
                  
 
                
 
            
 
            
 
三、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. }