Weitere ähnliche Inhalte
Ähnlich wie iOS程序设计-数据持久化 (20)
iOS程序设计-数据持久化
- 7. 属性列表
写数据
NSMutableDictionary *info = [NSMutableDictionary dictionary];
[info setObject:@"Tom" forKey:@"Player"];
[info setObject:[NSNumber numberWithInt:3000] forKey:@"Score"];
[info writeToFile:fileName atomically:YES];
或者
NSData *data = [NSPropertyListSerialization dataFromPropertyList:info
format:NSPropertyListXMLFormat_v1_0 errorDescription:nil];
[data writeToFile:fileName atomically:YES];
注意:NSDictionary的key对象必须实现NSCopying协议。若作为
属性列表,必须得是NSString,即使NSNumber都不可以, 因为key
值在XML中的元素类型只有1个<key>,无法区分类型。
- 8. 属性列表
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
"http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Player</key>
<string>Tom</string>
<key>Score</key>
<integer>3000</integer>
</dict>
</plist>
- 9. 属性列表
读数据
NSDictionary *info = [NSDictionary
dictionaryWithContentsOfFile:fileName];
或者
NSData *data = [NSData dataWithContentsOfFile:fileName];
NSDictionary *info = [NSPropertyListSerialization
propertyListFromData:data
mutabilityOption:NSPropertyListImmutable
format:&format
errorDescription:&error];
- 10. 属性列表
@interface Player : NSObject
@property(retain) NSString *name;
@property(assign) int score;
@end
Player *p = [[[Player alloc] init] autorelease];
p.name = @"Tom";
p.score = 3000;
NSMutableDictionary *info = [NSMutableDictionary dictionary];
[info setObject:p forKey:@"Player"];
[info writeToFile:fileName atomically:YES]; //写操作失败
- 14. NSJSONSerialization
iOS 5.0版本引入,替代JSONKit等开源工具
将NSArray, NSDictionary转化成JSON数据格式
NSArray, NSDictionary中的元素必须是NSString,
NSNumber, NSArray, NSDictionary, 或 NSNull
NSDictionary的key必须是NSString
用法
NSArray *players = …;
[NSJSONSerialization dataWithJSONObject:players
options:NSJSONWritingPrettyPrinted error:&error];
…
players = [NSJSONSerialization JSONObjectWithData:data
options:NSJSONReadingMutableContainers error:&error];
- 16. 对象归档
NSCoder
1. 序列形式
NSArchiver, NSUnarchiver (iOS不支持)
2. Key-Value形式
NSKeyedArchiver, NSKeyedUnarchiver
- 17. 对象归档
归档(Archive)
NSMutableData *data = [NSMutableData data];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc]
initForWritingWithMutableData:data];
[archiver encodeObject:player forKey:@”Player"];
//…
[archiver finishEncoding];
[data writeToFile:archivePath atomically:YES];
[NSKeyedArchiver archiveRootObject:player
toFile:archivePath];
- 18. 对象归档
解档(Unarchive)
NSData *data = [NSData dataWithContentsOfFile:archivePath];
unarchiver = [[NSKeyedUnarchiver alloc]
initForReadingWithData:data];
player = [unarchiver decodeObjectForKey:@”player"];
[unarchiver finishDecoding];
[unarchiver release];
player = [NSKeyedUnarchiver
unarchiveObjectWithFile:archivePath];
- 19. 对象归档
NSCoding协议
@interface Player : NSObject<NSCoding>
//…
- (id)initWithCoder:(NSCoder *)aDecoder
{
self = [super init];
//如果父类就已经实现了NSCoding协议
//self = [super initWithCoder:aDecoder];
if(self){
self.name = [aDecoder decodeObjectForKey:@"Name"];
self.score = [aDecoder decodeIntForKey:@"Score"];
}
return self;
}
- 20. 对象归档
NSCoding协议
- (void)encodeWithCoder:(NSCoder *)aCoder
{
//[super encodeWithCoder];
[aCoder encodeObject:self.name forKey:@"Name"];
[aCoder encodeInt:self.score forKey:@"Score"];
}
- 21. 对象归档
NSNumber, NSString, NSDate等,以及NSArray,
NSDictionary, NSSet集合类均实现了NSCoding协议
NSMutableArray *players = [NSMutableArray array];
[players addObject:player1];
…
//会调用数组中每个player对象的encoder
[NSKeyedArchiver archiveRootObject:players
toFile:archivePath];
//会调用decoder生成每个player对象
players = [NSKeyedUnarchiver
unarchiveObjectWithFile:archivePath];
- 23. SQLite
接口举例
1. 打开数据库
int sqlite3_open(constchar*filename,sqlite3**db);
1. 执行SQL语句
int sqlite3_exec(sqlite3 *db, const char *sql, int (*callback)(void
*, int, char **, char **), void *context, char **error);
2. 读取查询结果
int mycallback(void*context,int count, char**values, char**cols);
3. 关闭数据库
int sqlite3_close(sqlite3 *db);
- 26. Core Data
实体-关系模型
NSEntityDescription
NSAttributeDescription
NSRelationshipDescription
NSManagedObjectModel
- 28. Core Data
自动生成的Player类
@interface Player : NSManagedObject
@property (nonatomic, retain) NSNumber * name;
@property (nonatomic, retain) NSString * score;
@property (nonatomic, retain) NSManagedObject *team;
@end
- 29. Core Data
自动生成的Player类
@interface Player : NSManagedObject
@property (nonatomic, retain) NSNumber * name;
@property (nonatomic, retain) NSString * score;
@property (nonatomic, retain) NSManagedObject *team;
@end
@implementation Player
//dynamic指示符用于告诉编译器运行时会生成对应的读取方法
@dynamic name;
@dynamic score;
@dynamic team;
@end
- 30. Core Data
自动生成的Team类
@class Player;
@interface Team : NSManagedObject
@property (nonatomic, retain) NSString * name;
@property (nonatomic, retain) NSSet *players;
@end
@interface Team (CoreDataGeneratedAccessors)
//声明对应的添加和删除Player的方法,也是运行时才
实现
- (void)addPlayersObject:(Player *)value; @implementation Team
- (void)removePlayersObject:(Player *)value;
- (void)addPlayers:(NSSet *)values; @dynamic name;
- (void)removePlayers:(NSSet *)values; @dynamic players;
@end @end
- 31. Core Data
NSManagedObject遵循KVC
NSString *name = [managedObject valueForKey:@”name”];
等价于
NSString *name = player.name;
什么情况下需要继承NSManagedContext?
1. 代码更直观简洁
2. 添加方法或属性
比如,可以增加portrait方法,根据player.name属性,
查询文件返回对应的UIImage对象
- 32. Core Data
读取与存储数据
数据对象
NSManagedObject … NSManagedObject
数据对象管理器:增, NSManagedObjectContex
删,改,查,撤销/重
NSManagedObjectContext …
t
做
数据字典(一般加载合并
Bundle中的所有model) NSPersistentStoreCoordinator
NSManagedObjectMode
l
数据文 NSPersistentStore … NSPersistentStore
件
- 33. Core Data
初始化工作
model = [NSManagedObjectModel mergedModelFromBundles:nil]; //nil
表示从mainbundle中加载合并所有model
coordinator = [[NSPersistentStoreCoordinator alloc]
initWithManagedObjectModel:model];
[coordinator addPersistentStoreWithType:NSSQLiteStoreType
configuration:nil URL:storeUrl options:options error:&error];
context = [[NSManagedObjectContext alloc] init];
context.persistentStoreCoordinator = coordinator;
以上操作,iOS5.0下,等价于
UIManagedDocument *document = [[UIManagedDocument alloc]
initWithFileURL:storeUrl];
- 34. Core Data
增加记录
player = [NSEntityDescription
insertNewObjectForEntityForName:@"Player”
inManagedObjectContext:context];
team = [NSEntityDescription
insertNewObjectForEntityForName:@"Team”
inManagedObjectContext:context];
team.name = @"TheBest";
player.name = @"Tom";
player.score = [NSNumber numberWithInt:3000];
player.team = team;
if(![context save:&error]){
NSLog(@"%@", error);
}
- 35. Core Data
删除记录
[context deleteObject:player];
查询记录
NSFetchRequest *request = [NSFetchRequest
fetchRequestWithEntityName:@"Player"];
request.predicate = [NSPredicate
predicateWithFormat:@"score > 2000"];
NSSet *players = [context executeFetchRequest:request
error:&error];
修改记录
player.score = [NSNumber numberWithInt:3500];
- 36. Core Data
更多内容
1. 版本升级 NSMappingModel
2. NSManagedObjectContext与多线程
3. NSManagedObject的生命周期
4. iOS5.0, UIManagedDocument, iCloud
5. NSFetchedResultsController与UITableView
6. 内存使用与性能优化
7. Cocoa Binding (Mac OS X)