涉及到的主要类:NSUserDefaults,一般 [NSUserDefaults standardUserDefaults]就够用了
@interface User : NSObject <NSCoding> @property (nonatomic, assign) NSInteger userID; @property (nonatomic, copy) NSString *name; @end
// 存 [[NSUserDefaults standardUserDefaults] setInteger:userID forKey:@”userID”]; [[NSUserDefaults standardUserDefaults] setObject:name forKey:@”name”]; // 取 NSInteger uId = [[[NSUserDefaults standardUserDefaults] integerValueForKey:@”userID”]; NSString* name = [[NSUserDefaults standardUserDefaults] stringForKey:@”name”];
// 存 [[NSUserDefaults standardUserDefaults] setObject:self forKey:@”user”]; // 取 User* u = [[NSUserDefaults standardUserDefaults] objectForKey”@”user”];
@interface User : NSObject <NSCoding> @property (nonatomic, assign) NSInteger userID; @property (nonatomic, copy) NSString *name; @end @implementation User // 以下两个方法一定要实现,不然在调用的时候会crash - (void)encodeWithCoder:(NSCoder *)aCoder; { // 这里放置需要持久化的属性 [aCoder encodeObject:[NSNumber numberWithInteger:self.userID] forKey:@”userID”]; [aCoder encodeObject:self.name forKey:@"name"]; } - (id)initWithCoder:(NSCoder *)aDecoder { if (self = [self init]) { // 这里务必和encodeWithCoder方法里面的内容一致,不然会读不到数据 self.userID = [[aDecoder decodeObjectForKey:@"userID"] integerValue]; self.name = [aDecoder decodeObjectForKey:@"name"]; } return self; } // 使用方法 + (BOOL)save { NSError *error = nil; // 确定存储路径,一般是Document目录下的文件 NSString* fileName = [self getFileName]; NSString* filePath = [self getFilePath]; if (![[NSFileManager defaultManager] createDirectoryAtPath:filePath withIntermediateDirectories:YES attributes:nil error:&error]) { NSLog(@”创建用户文件目录失败”); return NO; } return [NSKeyedArchiver archiveRootObject:self toFile:[fileName:userId]]; } @end
4.Core Data
Core Data本质上是使用SQLite保存数据,但是它不需要编写任何SQL语句。
要使用Core Data,需要在Xcode中的数据模型编辑器中设计好各个实体以及定义好他们的属性和关系。之后,通过操作这些对象,结合Core Data完成数据的持久化:
NSManagedObjectContext *context = [appDelegate managedObjectContext]; NSError *error; NSString *fieldName = [NSString stringWithFormat:@"test%d", i]; UITextField *theField = [self valueForKey:fieldName]; NSFetchRequest *request = [[NSFetchRequest alloc] init]; //创 建描述语句,需求Line对象。类似于在数据库中限定为Line表。 NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Line" inManagedObjectContext:context]; [request setEntity:entityDescription]; //创建限制性语句,类似于SQL语句中的 where lineNum = i NSPredicate *pred = [NSPredicate predicateWithFormat:@"(lineNum = %d)", i]; [request setPredicate:pred]; NSManagedObject *theLine = nil; NSArray *objects = [context executeFetchRequest:request error:&error]; if (objects == nil){ NSLog(@”There was an error!”); // Do whatever error handling is appropriate } if ([objects count] > 0){ //如果符合条件的object存在,则取出 theLine = [objects objectAtIndex:0]; } else { //如果不存在,则插入一个新的. theLine = [NSEntityDescription insertNewObjectForEntityForName:@"Line" inManagedObjectContext:context]; [theLine setValue:[NSNumber numberWithInt:i] forKey:@”lineNum”]; //设置这个object的属性,coredata会自动将其写入sqlite [theLine setValue:theField.text forKey:@"lineText"]; [request release]; } }
Core_Data_PersistenceAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate]; NSManagedObjectContext *context = [appDelegate managedObjectContext]; NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"Line" inManagedObjectContext:context]; NSFetchRequest *request = [[NSFetchRequest alloc] init]; [request setEntity:entityDescription]; NSError *error; NSArray *objects = [context executeFetchRequest:request error:&error]; if (objects == nil) { NSLog(@”There was an error!”); // Do whatever error handling is appropriate } //每一个对象在CoreData中都表示为一个NSManagedObject对象(类似于数据库表中的每一行),他的属性通过键/值 方式获取 for (NSManagedObject *oneObject in objects) { NSNumber *lineNum = [oneObject valueForKey:@"lineNum"]; NSString *lineText = [oneObject valueForKey:@"lineText"]; } [request release];