iOS - 序列化与数据持久化

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.对象归档

归档方式有两个要点NSCodingNSKeyedArchiver

 

首先,要使用对象归档,对象必须实现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.gitSQLite都做了不错的封装。

 

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
iOS中的MMKV是一个高性能、轻量级的键值存储库,可以用于持久化数据。它由微信团队开发,通过使用C++编写的底层存储引擎,提供了比NSUserDefaults更快速和可靠的存储解决方案。 要在iOS中使用MMKV进行持久化,你可以按照以下步骤进行操作: 1. 集成MMKV库:首先,需要将MMKV库添加到你的iOS项目中。你可以通过CocoaPods或手动导入方式添加依赖。具体的集成步骤可以参考MMKV的官方文档。 2. 创建MMKV实例:在使用MMKV之前,你需要创建一个MMKV实例来操作数据。可以使用下面的代码创建一个MMKV实例: ``` // 导入MMKV头文件 #import <MMKV/MMKV.h> // 创建MMKV实例 NSString *mmkvID = @"your_mmkv_id"; MMKV *mmkv = [MMKV mmkvWithID:mmkvID]; ``` 在创建MMKV实例时,需要指定一个唯一的ID来区分不同的实例。这个ID会被用作数据存储的文件名。 3. 存储数据:使用MMKV实例可以方便地存储各种类型的数据。例如,存储字符串可以使用以下代码: ``` NSString *key = @"your_key"; NSString *value = @"your_value"; [mmkv setString:value forKey:key]; ``` 除了字符串外,MMKV还支持存储其他基本数据类型(如整数、布尔值等),以及NSData对象。 4. 读取数据:使用MMKV实例可以快速读取存储数据。以下是一个读取字符串数据的示例: ``` NSString *key = @"your_key"; NSString *value = [mmkv getStringForKey:key]; ``` 同样地,你也可以使用适当的方法来读取其他类型的数据。 通过这些简单的步骤,你可以在iOS应用中使用MMKV库进行持久化操作。希望这能对你有所帮助!如果有任何问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值