本地数据存储之UserDefaults
UserDefaults支持的基本数据类型包含:
NSData,NSString,NSNumber,NSDate,NSArray, orNSDictionary
对于自定义的类,如果直接存储会出现如下错误:
Property list invalid for format (property lists cannot contain objects of type ‘CFType’)
如果想存储自定义的类,需要对其进行编码即转换为基本数据类型。
类定义,以及转换为NSDictionary类型:
@interface XYZToDoItem : NSObject@property NSString *itemName;@property BOOL completed;//@property (readonly) NSDate *creationDate;@property NSDate *creationDate;- (NSDictionary *) encodedItem;@end</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里,并且读取转换为相应的类:- (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 rightdic1 = [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 rightdic1 = [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];}
综上为简单的对复杂的类进行简单封装并且读取的例子。
[参考:]
,所有欺骗中,自欺是最为严重的