iOS數據持久化之—屬性列表 – iPhone手機開發 iPhone軟體開發教學課程

iOS數據持久化之—屬性列表 屬性列表(plist)

  iOS提供瞭一種plist格式的文件(屬性列表)用於存儲輕量級的數據,並且隻能保存NSDictionary、NSArray、NSString、NSNumber、Boolean、NSData、NSDate 類型的數據。將這些類型的數據保存為plist格式文件,該格式保存的數據可以直接使用NSDictionary和NSArray讀取 

(一)、使用NSUserDefault 實現持久化

   下面來看下 NSUserDefault 本地保存的位置,數據持久化之沙盒目錄有提及。Library/Preferences 這個目錄下的 plist 文件就是其保存的目錄。
   NSUserDefault 的用法,主要是保存和讀取

   初始化一個 NSUserDefault

    + (NSUserDefaults *)standardUserDefaults;

    設置數據的方法

    - (void)setObject:(nullable id)value forKey:(NSString *)defaultName;
    - (void)setInteger:(NSInteger)value forKey:(NSString *)defaultName;
    - (void)setFloat:(float)value forKey:(NSString *)defaultName;
    - (void)setDouble:(double)value forKey:(NSString *)defaultName;
    - (void)setBool:(BOOL)value forKey:(NSString *)defaultName;
    - (void)setURL:(nullable NSURL *)url forKey:(NSString *)defaultName NS_AVAILABLE(10_6, 4_0);

   讀取數據的方法:

   - (nullable id)objectForKey:(NSString *)defaultName;
   - (nullable NSString *)stringForKey:(NSString *)defaultName;
   - (nullable NSArray *)arrayForKey:(NSString *)defaultName;
   - (nullable NSDictionary *)dictionaryForKey:(NSString *)defaultName;
   - (nullable NSData *)dataForKey:(NSString *)defaultName;
   - (nullable NSArray *)stringArrayForKey:(NSString *)defaultName;
   - (NSInteger)integerForKey:(NSString *)defaultName;
   - (float)floatForKey:(NSString *)defaultName;
   - (double)doubleForKey:(NSString *)defaultName;
   - (BOOL)boolForKey:(NSString *)defaultName;
   - (nullable NSURL *)URLForKey:(NSString *)defaultName NS_AVAILABLE(10_6, 4_0);

    刪除數據的方法:

    - (void)removeObjectForKey:(NSString *)defaultName;

   保存數據:

   // 如果不手動調用,系統會自動保存,但時間不定

    - (BOOL)synchronize;
 

   // 存儲id類型數據

   + (void)setValue:(id)value andKey:(NSString *)key

    {

    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

     [userDefaults setObject:value forKey:key];

     [userDefaults synchronize];

    }

    // 獲取數據

    + (NSString *)getValueByKey:(NSString *)key

    {

    NSUserDefaults * settings = [NSUserDefaults standardUserDefaults];

    NSString *value = [settings objectForKey:key];

    return value;

     }


(二)、手動添加plist文件

   新建文件-->Resource-->Property List

    輸入圖片說明

 

    plist文件的根類型隻能是NSArray或NSDictionary

    輸入圖片說明

    輸入圖片說明

 

   將plist文件中的數據讀入對應的根類型

    // 1、獲取文件所在的路徑,Resource:文件名稱、Type:文件格式

    NSString *filePath = [[NSBundle mainBundle] pathForResource:@"userInfos" ofType:@"plist"];

    // 2、從路徑中獲取對應格式的數據

    // 如果Root為NSArray,則使用數組保存

    NSArray *infos = [NSArray arrayWithContentsOfFile:filePath];

    NSLog(@"%@",infos);

    // 如果Root為NSDictionary,則使用字典保存

    NSDictionary *infoDic = [NSDictionary dictionaryWithContentsOfFile:filePath];

    NSLog(@"%@",infoDic);

 

(三)、直接講數據寫入plist文件

    由於 NSUserDefault 本質上就是通過 plist 文件來實現屬性的持久化。所以,我們可以通過自己創建一個 plist 文件來實現屬性的持久化。

        NSArray *path = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

        NSString *docPath = [path objectAtIndex:0];

        NSString *myFile = [docPath stringByAppendingPathComponent:@"test.plist"];

        NSMutableDictionary *contentDic;

        // 判斷本地是否存在 plist 文件
        if ([[NSFileManager defaultManager] fileExistsAtPath:myFile] == NO) {
            NSFileManager* fm = [NSFileManager defaultManager];
            // 創建一個文件
            [fm createFileAtPath:myFile contents:nil attributes:nil];
            contentDic = [[NSMutableDictionary alloc] init];
        } else {
            contentDic = [[NSMutableDictionary alloc] initWithContentsOfFile:myFile];
        } 
        // 數據的讀寫操作
        [contentDic setObject:@"1234" forKey:@"passWord"];
        // 將修改都的數據保存到 plist 文件中
        [contentDic writeToFile:myFile atomically:YES];

(四)、總結
    plist文件的讀寫效率比較高,由於他的讀寫需要將所有的數據取出再全部保存,所以隻適合小數據。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *