您的位置:首页 > 移动开发 > IOS开发

iOS 本地数据存储(一)

2015-10-05 09:26 543 查看
本地数据存储之UserDefaults

UserDefaults支持的基本数据类型包含:

NSData
NSString
NSNumber
NSDate
NSArray
,
or 
NSDictionary


对于自定义的类,如果直接存储会出现如下错误:

Property list invalid for format (property lists cannot contain objects
of type ‘CFType’)

如果想存储自定义的类,需要对其进行编码即转换为基本数据类型。

类定义,以及转换为NSDictionary类型:

[cpp] view
plaincopyprint?





@interface XYZToDoItem : NSObject  

  

@property NSString *itemName;  

@property BOOL completed;  

//@property (readonly) NSDate *creationDate;  

@property NSDate *creationDate;  

  

- (NSDictionary *) encodedItem;  

  

@end  

[cpp] view
plaincopyprint?





</pre><pre name="code" class="cpp">@implementation XYZToDoItem  

  

#pragma Used for encoded objects to be able to save to UserDeafaults  

- (NSDictionary *) encodedItem  

{  

    return [NSDictionary dictionaryWithObjectsAndKeys:self.itemName, @"itemName",  

            [NSNumber numberWithBool:self.completed], @"completed",  

            self.creationDate , @"creationDate", nil];  

}  

  

@end  

调用的地方,存储如UserDefault里,并且读取转换为相应的类:

[objc] view
plaincopyprint?





- (void) saveUserDefaultsOwn  

{  

    XYZToDoItem *item1 = [[XYZToDoItem alloc] init];  

    item1.itemName = @"Buy milk";  

    //[self.toDoItems addObject:item1];  

    XYZToDoItem *item2 = [[XYZToDoItem alloc] init];  

    item2.itemName = @"Buy eggs";  

    //[self.toDoItems addObject:item2];  

    XYZToDoItem *item3 = [[XYZToDoItem alloc] init];  

    item3.itemName = @"Read a book";  

    //[self.toDoItems addObject:item3];  

      

      

    NSUserDefaults *userdefaults = [NSUserDefaults standardUserDefaults];  

    [userdefaults setObject:[item1 encodedItem] forKey:@"item1"];  

    [userdefaults setObject:[item2 encodedItem] forKey:@"item2"];  

    [userdefaults setObject:[item3 encodedItem]forKey:@"item3"];  

      

    [userdefaults synchronize];  

}  

  

- (void) readUserDeafultsOwn  

{  

    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];  

    NSDictionary *dic1 = [[NSDictionary alloc] init];  

      

      

    dic1 = [userDefaults objectForKey:@"item1"];  

      

    XYZToDoItem *item1 = [[XYZToDoItem alloc] init];  

    item1.itemName = [dic1 objectForKey:@"itemName"];  

    item1.completed = [dic1 objectForKey:@"completed"];  

    item1.creationDate = [dic1 objectForKey:@"creationDate"]; //initial it is readonly, not right  

  

    dic1 = [userDefaults objectForKey:@"item2"];  

    XYZToDoItem *item2 = [[XYZToDoItem alloc] init];  

    item2.itemName = [dic1 objectForKey:@"itemName"];  

    item2.completed = [dic1 objectForKey:@"completed"];  

    item2.creationDate = [dic1 objectForKey:@"creationDate"]; //initial it is readonly, not right  

      

    dic1 = [userDefaults objectForKey:@"item2"];  

    XYZToDoItem *item3 = [[XYZToDoItem alloc] init];  

    item3.itemName = [dic1 objectForKey:@"itemName"];  

    item3.completed = [dic1 objectForKey:@"completed"];  

    item3.creationDate = [dic1 objectForKey:@"creationDate"]; //initial it is readonly, not right  

      

    //XYZToDoItem *item2 = [userDefaults objectForKey:@"item2"];  

    //XYZToDoItem *item3 = [userDefaults objectForKey:@"item3"];  

      

    [self.toDoItems addObject:item1];  

    [self.toDoItems addObject:item2];  

    [self.toDoItems addObject:item3];  

}  

综上为简单的对复杂的类进行简单封装并且读取的例子。

[参考:http://82apps.tumblr.com/post/11989743237/adding-turn-based-multiplayer-in-ios-5-part-3]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: