(转)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];
 
       # 写入文件:
 

         ;(转)iOS XML JSON SQLite CoreData 数据持久化

    }
     
二、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 XML JSON SQLite CoreData 数据持久化   
            (转)iOS XML JSON SQLite CoreData 数据持久化      
 
            (转)iOS XML JSON SQLite CoreData 数据持久化    
 
            (转)iOS XML JSON SQLite CoreData 数据持久化
 
            (转)iOS XML JSON SQLite CoreData 数据持久化
 
三、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、在程序中使用
     
 
            (转)iOS XML JSON SQLite CoreData 数据持久化
(转)iOS XML JSON SQLite CoreData 数据持久化
 

  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. }  

(转)iOS XML JSON SQLite CoreData 数据持久化,布布扣,bubuko.com

(转)iOS XML JSON SQLite CoreData 数据持久化

上一篇:实现Android半透明Menu效果的开发实例


下一篇:js判断两个日期的大小