当前位置:首页 » 存储配置 » ios持久化存储

ios持久化存储

发布时间: 2022-12-24 18:08:06

㈠ OC -- 应用数据储存方式

      之前对数据之久化一直都是一知半解,只知道有几种方法,但不清楚这几种方法的区别.经过网上的查询和学习.写一下自己的心得体会.

       数据持久化说白了就是将数据保存到本地的磁盘中.使得在应用程序重启后可以继续访问之前保存的数据.在ios中运用了很多的存储方式,一般我们用的方式分为以下5中:

沙盒是苹果的发明的内存管理机制,ios 程序默认情况下只能访问程序自身的目录,且这个目录被称为"沙盒"

应用程序包: 包含了所有的资源文件和可执行的文件.

Documents :保存应用运行时生成的需要数据持久化的数据,iTunes同步设备时会备份目录.例如游戏存档

tmp: 保存应用运行时所需的临时数据,使用完后就会将相应的文件从该目录删除,应用没有运行时,系统可能也会清除该文件下的数据.iTunes同步设备时,不会备份该目录.

Library / Caches : 保存应用运行时生成的需要持久化的数据,iTunes同步设备时不会备份该目录.-----一般存储体积大.不需要备份的非重要数据.

Library / Preference :保存应用的所有偏好设置,iOS的settings(设置)应用会在改目录中查找应用的设置信息.iTunes同步设备时会备份该目录.

虽然沙盒中有这么多文件夹,但是每个文件夹功能都是不相同的在上面我们也描述了,每次文件夹的功能.所以以后在存储数据的时候要注意存储的文件.一定要选择合适的文件夹.

获取相应文件夹位置的方法.

获取沙盒根目录

应用程序包:

Documents:(有两种获取方式)

TMP 

Library/Caches:

Library/Preference

Plist文件

plist文件是将某些特定的类,通过XML的文件方式保存在目录中,并且plist 文件是存储在Documents文件夹下面的.

可以被序列化的类型只有如下几种:

1获取文件路径

2.存储

3.读取

4.注意

只有以上列出的类型才能使用plist文件存储。

存储时使用writeToFile: atomically:方法。 其中atomically表示是否需要先写入一个辅助文件,再把辅助文件拷贝到目标文件地址。这是更安全的写入文件方法,一般都写YES。

读取时使用arrayWithContentsOfFile:方法。

㈡ ios中的持久化操作方式有哪些

iOS中的数据持久化方式,基本上有以下四种:属性列表、对象归档、sqlite3和Core Data

1.属性列表
涉及到的主要类:NSUserDefaults,一般 [NSUserDefaults standardUserDefaults]就够用了
@interface User : NSObject <NSCoding>
@property (nonatomic, assign) NSInteger userID;
@property (nonatomic, ) NSString *name;
@end
使用方法
1).分开存取
// 存
[[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”];

2.对象归档
要使用对象归档,对象必须实现NSCoding协议.大部分Object C对象都符合NSCoding协议,也可以在自定义对象中实现NSCoding协议,要实现NSCoding协议,实现两个方法:
- (void) encodeWithCoder:(NSCoder *)encoder 与 -(void)initWithCoder:(NSCoder *)encoder
同时,建议对象也同时实现NSCopying协议,该协议允许复制对象,要实现NSCopying协议须实现 -(id)WithZone:(NSZone *)zone 方法 。
@interface User : NSObject <NSCoding>
@property (nonatomic, assign) NSInteger userID;
@property (nonatomic, ) 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

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

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 :@"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];
转载

㈢ ios开发中数据持久化有哪几种,分别什么时间使用

1、plist文件(属性列表),通常用于储存用户设置,也可以用于存储捆绑的信息;
2、preference(偏好设置),常用于保存少量数据;
3、NSKeyedArchiver(归档),将内存中的对象实例保存成binary到磁盘并且可以逆向这个过程用来保存用户操作状态等;
4、SQLite 3,使用数据库进行存储;
5、CoreData,它提供了对象-关系映射(ORM)的功能,即能够将OC对象转化成数据,保存在SQLite数据库文件中,也能够将保存在数据库中的数据还原成OC对象。

㈣ IOS 存储方式(PList、NSUserDefaults、归档、CoreData、数据库、文件)

iOS开发,plist文件读写那些事 - (jianshu.com)

NSUserDefaults存储轻量级 的本地数据 ,比如要保存一个登陆界面的数据,用户名、密码之类的。

支持的数据类型有 NSString、 NSNumber、NSInteger、NSFloat、BOOL、NSArray、NSDictionary、NSDate、 等系统定义的数据类型。

用NSUserDefaults存储的数据下次程序运行的时候依然存在 .它的数据存储在应用程序内置的一个plist文件里, 在/Library/Prefereces沙盒路径下.

NSUserDefaults是定时把缓存中的数据写入磁盘的,而不是即时写入,为了防止在写完NSUserDefaults后程序退出导致的数据丢失,可以在写入数据后使用synchronize强制立即将数据写入磁盘:

使用NSKeyedArchiver 对数据进行 归档 反归档(将自定义类型转换为NSData类型:)

NSuserDefaults 的坑
iOS 最终,我还是决定放弃使用NSUserDefaults了 - (jianshu.io)

归档: ,就是将数据写到一个文件里面去。一般我们的应用的变量常量之类的数据都是在内存里面的,只要APP关闭,这些数据都会丢失。但是把数据存储到文件里面去,就能将数据保存到本地磁盘里面(目前iOS基本就是在沙盒里面操作了),不管是APP关闭还是重启设备,下次启动APP的时候都能够读出来。

解档: (别人也叫反归档),就是将数据从文件里面读取出来。在程序里面使用。

【iOS】数据持久化:使用NSKeyedArchiver进行数据归档 - (jianshu.com)

iOS 开发Core Data使用方法 – 技术狗 (jishudog.com)

IOS 开发文件操作——NSFileManager - 星语海蓝 - 博客园 (cnblogs.com)
(15条消息) iOS文件操作_你有故事,我囿酒-CSDN博客

参考:
iOS开发 - 关于 NSUserDefaults 的使用 - (jianshu.com)

㈤ iOS数据存储(一)介绍

iOS本地化存储的数据保存在沙盒中。
(1) Documents :iTunes会备份该目录。一般用来存储需要持久化的数据。
(2) Library/Caches :缓存,iTunes不会备份该目录。内存不足时会被清除,应用没有运行时,可能会被清除。一般存储体积大、不需要备份的非重要数据。
(3) Library/Preference :iTunes同会备份该目录,可以用来存储一些偏好设置。
(4) tmp : iTunes不会备份这个目录,用来保存临时数据,应用退出时会清除该目录下的数据。

获取沙盒文件:

其中:

  可以把字典或数组直接写入到文件中。另外, NSString 、 NSData 、 NSNumber 等类型,也可以使用 writeToFile:atomically: 方法直接将对象写入文件中,只是 Type 为空。

   NSUserDefaults是轻量级存储,一般使用它来进行一些设置的记录,比如用户ID,开关是否打开等设置,通过键值对的方式记录设置,所以这个有时候也被称为偏好设置。
  NSUserDefaults可以存储的数据类型包括: NSData 、 NSString 、 NSNumber 、 NSDate 、 NSArray 、 NSDictionary 。如果要存储其他类型,则需要转换为前面的类型,才能用NSUserDefaults存储。

也可以写成宏定义

㈥ iOS中常用的几种持久化存储

1、偏好设置(NSUserDefaults)
2、plist文件存储
3、归档
4、SQLite
5、Core Data

我们首先需要了解下沙盒(Sandbox)

Application :存放程序源文件,上架前经过数字签名,上架后不可修改
Documents : 保存应⽤运行时生成的需要持久化的数据,iTunes同步设备时会备份该目录。例如,游戏应用可将游戏存档保存在该目录
tmp : 保存应⽤运行时所需的临时数据,使⽤完毕后再将相应的文件从该目录删除。应用 没有运行时,系统也可能会清除该目录下的文件。iTunes同步设备时不会备份该目录。
Library/Caches : 保存应用运行时⽣成的需要持久化的数据,iTunes同步设备时不会备份 该目录。⼀一般存储体积大、不需要备份的非重要数据,比如网络数据缓存存储到Caches下
Library/Preference : 保存应用的所有偏好设置,如iOS的Settings(设置) 应⽤会在该目录中查找应⽤的设置信息。iTunes同步设备时会备份该目录

NSUserDefaults是个单例类,用于存储少量数据。NSUserDefaults实际上对plist文件操作的封装,更方便我们直接操作,一般用于存储系统级别的偏好设置。比如我们经常将登录后的用户的一些设置通过NSUserDefaults存储到plist文件中。

NSUserDefaults使用起来非常简单,例如将用户的账号和密码存储起来:

㈦ ios数据持久化 - preference(偏好设置)

1.plist文件(属性列表)

2.preference(偏好设置)

3.NSKeyedArchiver(归档)

4.SQLite 3

5.CoreData

偏好设置是专门用来保存应用程序的配置信息的,一般不要在偏好设置中保存其他数据。

如果没有调用synchronize方法,系统会根据I/O情况不定时刻地保存到文件中。所以如果需要立即写入文件的就必须调用synchronize方法。

偏好设置会将所有数据保存到同一个文件中。即preference目录下的一个以此应用包名来命名的plist文件。

NSUserDefaults适合存储轻量级的本地数据,如登陆界面的数据,用户名、密码等用户偏好设置类的数据。下次启动应用的时候就可以直接从NSUserDefaults里面读取上次运行的数据。

如果使用自己建立的plist文件什么的,需要自己显式创建文件,读取文件,很麻烦,而如果用NSUserDefaults则不用管这些,就像读字典一样,直接读取数据就可以了,同时NSUserDefaults有缓存机制,可以避免频繁读写文件。

NSUserDefaults支持的数据格式有:NSNumber(BOOL、Integer、Float、Double),NSString,NSDate,NSArray,NSDictionary,NSData类型。

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

//添加preference

[defaults setObject:@"value1" forKey:@"key1"];

[defaults setObject:@1111 forKey:@"key2"];

[defaults synchronize];

//删除preference

[defaults removeObjectForKey:@"key1"];

[defaults synchronize];

//修改preference

[defaults setObject:@"value2" forKey:@"key1"];

[defaults synchronize];

//删除所有preference

NSString *appDomainStr = [[NSBundle mainBundle] bundleIdentifier];

[defaults removePersistentDomainForName:appDomainStr];

NSString *key1Value = [defaults objectForKey:@"key1"];

NSNumber *key2Value = [defaults objectForKey:@"key2"];

NSLog(@"偏好设置=%@=%@",key1Value,key2Value);

热点内容
java返回this 发布:2025-10-20 08:28:16 浏览:600
制作脚本网站 发布:2025-10-20 08:17:34 浏览:892
python中的init方法 发布:2025-10-20 08:17:33 浏览:585
图案密码什么意思 发布:2025-10-20 08:16:56 浏览:769
怎么清理微信视频缓存 发布:2025-10-20 08:12:37 浏览:689
c语言编译器怎么看执行过程 发布:2025-10-20 08:00:32 浏览:1016
邮箱如何填写发信服务器 发布:2025-10-20 07:45:27 浏览:261
shell脚本入门案例 发布:2025-10-20 07:44:45 浏览:119
怎么上传照片浏览上传 发布:2025-10-20 07:44:03 浏览:809
python股票数据获取 发布:2025-10-20 07:39:44 浏览:718