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
 通過hometmp目錄
            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,這個相當於ODBCCommand對象,用於保存編譯好的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. }  
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章