iOS - 序列化与数据持久化
来源:互联网 发布:音箱设计软件 编辑:程序博客网 时间:2024/05/21 09:49
iOS中的数据持久化方式,基本上有以下四种:
1.属性列表
2.对象归档
3. SQLite3
4. Core Data
1.属性列表
使用用户配置文件存储,也就是.plist文件。适合用来存储少量的配置数据。
使用属性列表我们需要使用NSUserDefaults类,一般[NSUserDefaults standardUserDefaults]就够用了
比方说一个类,
@interface User : NSObject<NSCoding>
@property (nonatomic, assign)NSInteger userID;
@property (nonatomic, copy)NSString *name;
@end
下面是两种使用方法
1)属性存取
//存
[[NSUserDefaultsstandardUserDefaults] setInteger:userID forKey:@”userID”];
[[NSUserDefaultsstandardUserDefaults] setObject:name forKey:@”name”];
//取
NSInteger uId = [[[NSUserDefaultsstandardUserDefaults] integerValueForKey:@”userID”];
NSString* name = [[NSUserDefaultsstandardUserDefaults] stringForKey:@”name”];
2) 按对象存取
//存
[[NSUserDefaultsstandardUserDefaults] setObject:self forKey:@”user”];
//取
User* u =[[NSUserDefaults standardUserDefaults] objectForKey”@”user”];
完整例子:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docPath = [paths objectAtIndex:0];
NSString *myFile = [docPath stringByAppendingPathComponent:@"my.list"];
NSArray *array = [[NSArray alloc] initWithContentsOfFile:myFile];
//操作完若修改了数据则,写入文件
[array writeToFile:myFile atomically:YES];
2.对象归档
归档方式有两个要点NSCoding和NSKeyedArchiver
首先,要使用对象归档,对象必须实现NSCoding协议,然后使用NSKeyedArchiver来序列化和反序列化数据。
大部分Objective-C对象都符合NSCoding协议,也可以在自定义对象中实现NSCoding协议,要实现NSCoding协议,实现两个方法:
- (void) encodeWithCoder:(NSCoder*)encoder
-(void)initWithCoder:(NSCoder*)encoder
同时,一般来说数据对象也需要同时实现NSCopying协议,以实现数据的拷贝。
-(id)copyWithZone:(NSZone *)zone方法。
1.实现NSCoding协议
@interface User : NSObject<NSCoding>
@property (nonatomic, assign)NSInteger userID;
@property (nonatomic, copy)NSString *name;
@end
@implementation User
//以下两个方法一定要实现,不然在调用的时候会crash
-(void)encodeWithCoder:(NSCoder *)aCoder;
{
//这里放置需要持久化的属性
[aCoder encodeObject:[NSNumbernumberWithInteger:self.userID] forKey:@”userID”];
[aCoder encodeObject:self.nameforKey:@"name"];
}
- (id)initWithCoder:(NSCoder*)aDecoder
{
if (self = [self init])
{
// 这里务必和encodeWithCoder方法里面的内容一致,不然会读不到数据
self.userID = [[aDecoderdecodeObjectForKey:@"userID"] integerValue];
self.name = [aDecoderdecodeObjectForKey:@"name"];
}
return self;
}
2.使用NSKeyedArchiver序列化
-(void)testNSKeyedArchiver
{
// define game data 1
NSString *stringGameData1 =@"游戏数据1";
// define game data 2
NSString *stringGameData2 =@"游戏数据2";
// get game data
NSArray *arrayGameData = [NSArrayarrayWithObjects: stringGameData1, stringGameData2, nil];
// get directory
NSString *stringPath =[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES) objectAtIndex: 0];
// get file name
NSString *stringFileName = [stringPathstringByAppendingPathComponent: @"FileTestNSKeyedArchiver"];
// failed to archive
if(![NSKeyedArchiver archiveRootObject:arrayGameData toFile: stringFileName]) {
CCLOG(@"testNSKeyedArchivererror");
}
// archive successfully
else {
CCLOG(@"%@", stringFileName);
}
}
3. NSKeyedUnarchiver反序列化
-(void)testNSKeyedUnarchiver
{
// get directory
NSString *stringPath =[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES) objectAtIndex: 0];
// get file name
NSString *stringFileName = [stringPathstringByAppendingPathComponent: @"FileTestNSKeyedArchiver"];
// get game data
NSArray *arrayGameData = [NSKeyedUnarchiverunarchiveObjectWithFile: stringFileName];
// get game data 1
NSString *stringGameData1 = [arrayGameDataobjectAtIndex: 0];
// get game data 2
NSString *stringGameData2 = [arrayGameDataobjectAtIndex: 1];
// output game data
CCLOG(@"%@ %@", stringGameData1,stringGameData2);
}
3.SQLite3
SQLite是一个开源的嵌入式关系数据库,它在2000年由D. Richard Hipp发布,它的减少应用程序管理数据的开销,SQLite可移植性好,很容易使用,很小,高效而且可靠。
SQLite嵌入到使用它的应用程序中,它们共用相同的进程空间,而不是单独的一个进程。从外部看,它并不像一个RDBMS,但在进程内部,它却是完整的,自包含的数据库引擎。嵌入式数据库的一大好处就是在你的程序内部不需要网络配置,也不需要管理。因为客户端和服务器在同一进程空间运行。SQLite的数据库权限只依赖于文件系统,没有用户帐户的概念。SQLite有数据库级锁定,没有网络服务器。它需要的内存,其它开销很小,适合用于嵌入式设备。你需要做的仅仅是把它正确的编译到你的程序。
我没有具体用过,关于SQLite的开发资料也较多,这里不再细说。只是建议不直接操作SQLite库,而是采用一些开源的第三方库来进行操作。比如:FMDB:https://github.com/ccgus/fmdb.git对SQLite都做了不错的封装。
4.Core Data
Core Data 是 iOS 3.0以后引入的数据持久化解决方案,其原理是对SQLite的封装,是开发者不需要接触SQL语句,就可以对数据库进行的操作.
要使用Core Data,需要在Xcode中的数据模型编辑器中设计好各个实体以及定义好他们的属性和关系。之后,通过操作这些对象,结合Core Data完成数据的持久化。
按我的理解是类似于Entity Framework的一套东西,具体没有用过,Mark一下,留待以后有空研究。
http://blog.csdn.net/ysy441088327/article/details/8606019
http://www.cnblogs.com/jy578154186/archive/2013/02/27/2935394.html
http://www.cnblogs.com/nightwolf/p/3217376.html
部分例子参考自:
http://www.cocoachina.com/bbs/read.php?tid=137443
http://blog.csdn.net/nono_love_lilith/article/details/7539659
http://www.cnblogs.com/ketmales/archive/2013/02/03/2890859.html
- iOS - 序列化与数据持久化
- IOS 数据持久化
- iOS 数据持久化
- ios数据持久化
- IOS数据持久化
- iOS数据持久化
- ios数据持久化
- iOS数据持久化
- iOS 数据持久化
- iOS 数据持久化
- iOS数据持久化
- iOS数据持久化
- iOS数据持久化
- iOS数据持久化
- iOS 数据持久化
- iOS 数据持久化
- ios数据持久化
- iOS数据持久化
- 【矩阵】BZOJ 1875 || SDOI 2009 HH去散步
- Objective-C在ARC下结合GCD的单例模式和宏模版
- md5sum
- acm算法书籍收藏推荐
- 分析Cocos2d Android 项目的生成和运行
- iOS - 序列化与数据持久化
- C/C++ STL
- 5、如何减小误差 [Stanford - Machine Learning]
- 在text中找出以同样的顺序连续出现在query中的最长连续字母序列的长度
- jsp页面判断登入输入的用户名和密码不能为空
- 模拟实现数据库常用操作效果
- android在edittext中对回车键进行改变
- hdu2059龟兔赛跑
- BufferedReader和BufferedWriter