ios数据持久化

本文深入探讨iOS开发与Swift编程技巧,涵盖Swift语言特性、iOS应用架构设计、UI开发、性能优化等内容,旨在帮助开发者提升iOS应用开发能力。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、APP生成的文件

1.Documents:

只有用户生成的文件、其他数据及其他程序不能重新创建的文件,应该保存在/Documents 目录下面,并将通过iCloud自动备份。

2.Library:

可以重新下载或者重新生成的数据应该保存在 /Library/Caches 目录下面。举个例子,比如杂志、新闻、地图应用使用的数据库缓存文件和可下载内容应该保存到这个文件夹,一般保存用户设置数据。

3.tmp:

只是临时使用的数据应该保存到 /tmp 文件夹。尽管 iCloud 不会备份这些文件,但在应用在使用完这些数据之后要注意随时删除,避免占用用户设备的空间,简单说就是存放临时资源。

二、属性列表

1、用到类NSUserDefaults(注意标准默认用户即 [NSUserDefaults standardUserDefaults])
@interface User : NSObject <NSCoding>
@property (nonatomic, assign) NSInteger userID;
@property (nonatomic, copy) NSString *name;
@end

使用方法
1).基本数据分开存取
// 存<注意这里string存是用object不是string>

[[NSUserDefaults standardUserDefaults] setInteger:userID forKey:@”userID”];
[[NSUserDefaults standardUserDefaults] setObject:name forKey:@”name”];

// 取

NSInteger uId = [[[NSUserDefaults standardUserDefaults] integerValueForKey:@”userID”];
NSString* name = [[NSUserDefaults standardUserDefaults] stringForKey:@”name”];

2).按对象存取
// 存

[[NSUserDefaults standardUserDefaults] setObject:self forKey:@”user”];

// 取

User* u = [[NSUserDefaults standardUserDefaults] objectForKey”@”user”];

三、对象归档

1、NSCoding协议

要使用对象归档,对象必须实现NSCoding协议.大部分Object C对象都符合NSCoding协议(NSString,NSDictionary,NSArray,BOOL等基本数据类型)
当然,自定义的对象也可以归档,但必须遵循NSCoding协议,并实现两个方法

- (void) encodeWithCoder:(NSCoder *)encoder  
 -(void)initWithCoder:(NSCoder *)encoder

同时,建议对象也同时实现NSCopying协议,该协议允许复制对象,要实现NSCopying协议须实现

-(id)copyWithZone:(NSZone *)zone 

@interface User : NSObject <NSCoding>
@property (nonatomic, assign) NSInteger userID;
@property (nonatomic, copy) NSString *name;
@end
@implementation User
// 以下两个方法一定要实现,不然在调用的时候会crash
- (void)encodeWithCoder:(NSCoder *)encoder; 
{
// 这里放置需要持久化的属性
[encoder encodeObject:[NSNumber numberWithInteger:self.userID] forKey:@"userID”];
[encoder encodeObject:self.name forKey:@"name"];
}
- (id)initWithCoder:(NSCoder *)encoder
{
if (self = [self init])
{
//  这里务必和encodeWithCoder方法里面的内容一致,不然会读不到数据
self.userID = [[encoder decodeObjectForKey:@"userID"] integerValue];
self.name = [encoder 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
2、反归档

1)创建一个反归档类

NSKeyedUnarchiver*unarchiver = [[NSKeyedUnarchiveralloc] initForReadingWithData:Data]; 

2) 反归档

NSArray*array  = [unarchiver decodeObjectForKey:@"array"];

3)结束反归档

[unarchiver finishDecoding];   

四、SQLite

SQLite是一个开源的嵌入式关系数据库,它在2000年由D. Richard Hipp发布,它的减少应用程序管理数据的开销,SQLite可移植性好,很容易使用,很小,高效而且可靠。
SQLite嵌入到使用它的应用程序中,它们共用相同的进程空间,而不是单独的一个进程。从外部看,它并不像一个RDBMS,但在进程内部,它却是完整的,自包含的数据库引擎。 嵌入式数据库的一大好处就是在你的程序内部不需要网络配置,也不需要管理。因为客户端和服务器在同一进程空间运行。SQLite 的数据库权限只依赖于文件系统,没有用户帐户的概念。SQLite 有数据库级锁定,没有网络服务器。它需要的内存,其它开销很小,适合用于嵌入式设备。你需要做的仅仅是把它正确的编译到你的程序。
关于SQLite的开发资料较多,这里不再细说。只是建议不直接操作SQLite库,而是采用一些开源的第三方库来进行操作。比如:
FMDB:https://github.com/ccgus/fmdb.git
对SQLite都做了不错的封装。

五、Core Data

好文地址:http://www.entlib.net/?p=2470,鉴于排版原因,推荐去原地址进行阅读!

这里是另一篇好文章 http://blog.youkuaiyun.com/kesalin/article/details/6739319

这里是另一篇 http://hxsdit.com/1622

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值