新浦京81707con > 注册购买 > iOS中数据保存的方式分析,浅谈iOS本地数据保存

原标题:iOS中数据保存的方式分析,浅谈iOS本地数据保存

浏览次数:73 时间:2020-03-21

iOS本地数据保存有四种方法,譬如NSUserDefaults、归档、文件保留、数据库、CoreDataKeyChain等多种措施。在那之中KeyChain是保留到沙盒范围以外的地点,也便是与沙盒非亲非故。

iOS中承诺关键的数据保存方法有各种:

iOS中许诺关键的多寡保存方法有多种:NSUserDefaults:、归档、文件保留、sqlite数据库——iOS数据库、CoreData、KeyChain;

沙盒

  • 每一种iOS应用程序都有和睦的单身目录,那些目录正是应用程序的沙盒。大家得以通过NSHomeDirectory()取妥善前选拔的家目录,也正是如今应用程序沙盒的根目录。
  • Xcode5以下和Xcode6以上沙盒目录文件夹个数不均等,Xcode6上述有3个公文夹,如下图所示,而Xcode5以下多了三个项目名字.app的公文,比如项目名称叫Demo,则沙盒中文件为Demo.app

图片 1沙盒目录文件结构

  • Xcode5以下和Xcode6以上沙盒的模拟器路线也可能有调换。如下图为Xcode6沙盒模拟器路线:

    图片 2Xcode6模拟器沙盒路线

  • 沙盒目录文件深入分析

    • Documents:保存客商发生的多少,iTunes同步设备的时候会备份该目录。客商暴发的数据正是指顾客在应用当前app的时候保存的一部分数据,举例保留app中的图片、保存下载的文本等。
    • Library:以此目录下有2个文件夹,三个是Caches、一个是Preferences,Caches重在保存缓存数据,比如SDWebImage把缓存的图形就寄存到该目录下。当程序退出后,改目录保存的文本间接存在。PreferencesXcode6事情发生前封存的是心爱设置,譬喻NSUserDefaults封存的文本。但是Xcode6如上就保留到/Users/用户名/Library/ Developer/CoreSimulator/Devices/模拟器UDID/data/Library/Preferences/文件夹下。
    • tmp:保留程序中的一时数据,当程序退出后系统会活动删除tmp中具有的文本。
  • 梯次目录的获得格局

Documents:路径获取有3种办法

  1. 行使字符串拼接,在home目录前面拼接字符串Documents
//获取家目录NSString *homeDocumentPath = NSHomeDirectory();//拼接NSString *documents = [homeDocumentPath stringByAppendingPathComponent:@"Documents"];
  1. NSSearchPathForDirectoriesInDomains方法
// 获取documents目录//参数1:表示Documents目录。参数2:当前用户目录(user's home directory --- place to install user's personal items)。 参数3:YES 代表展开路径中的波浪字符“~”NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);// 只有一个documentsNSString *documents = [paths lastObject];
  1. NSFileManager
 //获取documents路径 [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]

Library/Caches: 也是3种方法

  1. 应用字符串拼接,在home目录前边拼接Library/Caches
NSString *homeDocumentPath = NSHomeDirectory();//拼接NSString *cachePath = [homeDocumentPath stringByAppendingPathComponent:@"Library/Caches"];
  1. NSSearchPathForDirectoriesInDomains方法
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES);// 只有一个cachesNSString *cachePath = [paths lastObject];
  1. NSFileManager
[[[NSFileManager defaultManager] URLsForDirectory: NSCachesDirectory inDomains:NSUserDomainMask] lastObject]

tmp路线获取:

NSString *tmp = NSTemporaryDirectory();
  • NSUserDefaults:
  • 归档
  • 文件保留
  • sqlite数据库——iOS数据库
  • CoreData
  • KeyChain

1. NSUserDefaults

iOS当地数据保存常用格局

  • NSUserDefaults
  • 归档
  • 文件
  • 数据库
  • CoreData
  • KeyChain
  • NSUserDefaults 是一个单例对象,在全方位应用程序的生命周期中都独有三个实例。
  • NSUserDefaults保存的数据类型有:NSNumber, 基本数据类型(int,NSInter,float,double,CGFlat......卡塔尔国, NSString, NSData, NSArray, NSDictionary, NSU中华VL。
  • NSUserDefaults相通保存配置音讯,比方客商名、密码、是或不是保存客户名和密码、是还是不是离线下载等一些配置规格消息。
  • 骨干用法:
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];//保存值(key值同名的时候会覆盖的) [defaults setObject:@"用户名" forKey:kUsernameKey];//立即保存[defaults synchronize];//取值NSString *username = [defaults objectForKey:kUsernameKey];
  • 长期以来,保存还会有一点方法,举个例子:
//保存NSInteger[defaults setInteger:(NSInteger) forKey:(nonnull NSString *)];//保存BOOL [defaults setBool: forKey:(nonnull NSString *)];//保存NSURL [defaults setURL:(nullable NSURL *) forKey:(nonnull NSString *)];//保存float [defaults setFloat: forKey:(nonnull NSString *)];//保存double [defaults setDouble: forKey:(nonnull NSString *)];
  • 取值其余方法:
//取值 [defaults integerForKey:(nonnull NSString *)]; [defaults boolForKey:(nonnull NSString *)]; [defaults URLForKey:(nonnull NSString *)]; [defaults floatForKey:(nonnull NSString *)]; [defaults doubleForKey:(nonnull NSString *)];
  • 去除方法:
//删除指定key的数据 [defaults removeObjectForKey:(nonnull NSString *)];
  • synchronize。立时保存,苹果文书档案这么说:

Writes any modifications to the persistent domains to disk and updates all unmodified persistent domains to what is on disk.Return Value YES if the data was saved successfully to disk, otherwise NO.

  • 诚如保存自定义的目的,不过独有坚决守住NSCoding的类手艺只用归档。

  • 准守NSCoding磋商应当要落实五个require方法

  • encodeWithCoder:(NSCoder *)aCoder //归档会触发

  • - (nullable instancetype)initWithCoder:(NSCoder *)aDecoder //解归档会触发

  • Coding类具体贯彻:

@interface Coding : NSObject<NSCoding>@property (nonatomic, copy) NSString *name;@property (nonatomic, assign) NSInteger age;

#import "Coding.h"#import <objc/runtime.h>@implementation Coding /** * 根据类动画获取类的所有属性,不要忘记导入#import <objc/runtime.h> * * @param cls <#cls description#> * * @return <#return value description#> */- (NSArray *)perperiesWithClass:cls{ NSMutableArray *perperies = [NSMutableArray array]; unsigned int outCount; //动态获取属性 objc_property_t *properties = class_copyPropertyList(cls, &outCount); //遍历person类的所有属性 for (int i = 0; i < outCount; i  ) { objc_property_t property = properties[i]; const char *name = property_getName; NSString *s = [[NSString alloc] initWithUTF8String:name]; [perperies addObject:s]; } return perperies;}/** * 归档会触发 * * @param aCoder <#aCoder description#> */- encodeWithCoder:(NSCoder *)aCoder{ for (NSString *perperty in [self perperiesWithClass:[self class]]) { [aCoder encodeObject:perperty forKey:perperty]; }}/** * 解归档会触发 * * @param aDecoder <#aDecoder description#> * * @return <#return value description#> */- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder{ if (self = [super init]) { for (NSString *perperty in [self perperiesWithClass:[self class]]) { [self setValue:[aDecoder decodeObjectForKey:perperty] forKey:perperty];; } } return self;}@end
  • 归档具体行使:
 Coding *coding1 = [[Coding alloc] init]; coding1.name = @"小明"; coding1.age = 12; Coding *coding2 = [[Coding alloc] init]; coding1.name = @"小王"; coding1.age = 20; NSArray *array = @[coding1, coding2]; //保存对象转化为二进制数据 NSMutableData *data = [NSMutableData data]; //1.初始化 NSKeyedArchiver *archivier = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data]; //2.归档 [archivier encodeObject:array forKey:@"key"]; //3.完成归档 [archivier finishEncoding]; //4.保存 [[NSUserDefaults standardUserDefaults] setObject:data forKey:@"data"];
  • 解归档的切实采纳:
//1.获取保存的数据 NSData *data = [[NSUserDefaults standardUserDefaults] objectForKey:@"data"]; //2.初始化解归档对象 NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data]; //3.解归档 NSArray *persons = [unarchiver decodeObjectForKey:@"key"]; //4.完成解归档 [unarchiver finishDecoding];
  • 一般在iOS用plist保存,plist自个儿正是XML文件,名字后缀为.plist
  • plist尤为重要保存的数据类型为NSStringNSNumberNSDataNSArrayNSDictionary
  • 具体落到实处:
//把字典写入到plist文件,比如文件path为:~/Documents/data.plist [dictionary writeToFile:path atomically:YES];//把数组写入到plist文件中 [array writeToFile:path atomically:YES];
  • 读取数据
NSDictionary *dictionary = [NSDictionary dictionaryWithContentsOfURL:[NSURL fileURLWithPath:(nonnull NSString *)]]; NSDictionary *dictionary = [NSDictionary dictionaryWithContentsOfFile:[[NSBundle mainBundle] pathForResource:(nullable NSString *) ofType:(nullable NSString *)]];

 NSArray *array = [NSArray arrayWithContentsOfURL:[NSURL fileURLWithPath:(nonnull NSString *)]]; NSArray *array = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:(nullable NSString *) ofType:(nullable NSString *)]];
  • iOS用的sqlite3, 使用sqlite3亟待配置库文件libsqlite3.tbd要么导入libsqlite3.0.tbd,那多个库导入任何三个都得以,如图所示。

    图片 3导入库

  • 封存多量数目足以先行酌量用数据库,sql语句对查询操作有优化功效,所以从询问速度依然插入功效都是相当高的。

  • 先是须要对常用的sql语句询问。这里就不在介绍了,能够看下那一个课程:<a>;

  • sqlite应用手续:

    • 点名数据库路线。
    • 创建sqlite3指标并且展开数据库。
    • 创建表。
    • 对数据库操作,包蕴增加和删除改查。
    • 关门数据库。
  • 切切实实得以落成:

  • 数据库路径
 //返回数据库路径,保存到Cache目录下-(NSString *)databasePath{ NSString *path = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES)[0]; return [path stringByAppendingPathComponent:@"contacts.db"];}
  • 创建sqlite3对象并且张开数据库,就算数据库展开成功,就创立表。
 //数据库对象 sqlite3 *contactDB; const char *path = [[self databasePath] UTF8String]; if (sqlite3_open(path, &contactDB) == SQLITE_OK) { char *errMsg; const char *sql_stmt = "CREATE TABLE IF NOT EXISTS CONTACTS(ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT, ADDRESS TEXT,PHONE TEXT)"; //执行语句 if (sqlite3_exec(contactDB, sql_stmt, NULL, NULL, &errMsg) != SQLITE_OK) { //创建表失败 } } else { //打开数据库失败 } sqlite3_close(contactDB);
  • 代码解释:
  • sqlite3_open:开垦钦命路径的数据库,假设数据库荒诞不经,就能够创建四个新的数据库。
  • SQLITE_OK 是一个常量,表示展开数据库成功。上边是苹果的概念:
> #define SQLITE_OK 0 /* Successful result */
  • contactDB 正是数据库对象。

  • sqlite3_exec就算进行sql语句方法。

  • sqlite3_close关闭数据库,日常近些日子不要数据库的时候手动关闭,防止能源浪费。

  • 保留数据到数据库

 //是一个抽象类型,是一个句柄,在使用过程中一般以它的指针进行操作 sqlite3_stmt *statement; //数据库路径 const char *path = [[self databasePath] UTF8String]; //使用的时候打开数据库 if (sqlite3_open(path, &contactDB) == SQLITE_OK) { NSString *insertSQL = [NSString stringWithFormat:@"INSERT INTO CONTACTS (name,address,phone) VALUES("%@","%@","%@")",name.text,address.text,phone.text]; const char *insert_stmt = [insertSQL UTF8String]; // 这个函数将sql文本转换成一个准备语句(prepared statement)对象,同时返回这个对象的指针。这个接口需要一个数据库连接指针以及一个要准备的包含SQL语句的文本。它实际上并不执行这个SQL语句,它仅仅为执行准备这个sql语句 sqlite3_prepare_v2(contactDB, insert_stmt, -1, &statement, NULL); //执行这个sql if (sqlite3_step(statement) == SQLITE_DONE) { //TODO:已存储到数据库; } else { //TODO:保存失败 } //销毁statement对象 sqlite3_finalize(statement); //关闭数据库 sqlite3_close(contactDB); }
  • 询问操作
//数据库路径const char *path = [[self databasePath] UTF8String];//查询结果集对象句柄 sqlite3_stmt *statement; //打开数据库 if (sqlite3_open(path, &contactDB) == SQLITE_OK) { //查询的sql语句 NSString *querySQL = [NSString stringWithFormat:@"SELECT address,phone from contacts where name="%@"",name.text]; const char *query_stmt = [querySQL UTF8String]; //执行查询sql语句 if (sqlite3_prepare_v2(contactDB, query_stmt, -1, &statement, NULL) == SQLITE_OK) { //遍历每条数据 if (sqlite3_step(statement) == SQLITE_ROW) { //获取每条数据的字段。 NSString *addressField = [[NSString alloc] initWithUTF8String:(const char *)sqlite3_column_text(statement, 0)]; address.text = addressField; NSString *phoneField = [[NSString alloc] initWithUTF8String:(const char *)sqlite3_column_text(statement, 1 )]; phone.text = phoneField; //TODO:已查到结果 } else { //TODO:未查到结果 } sqlite3_finalize(statement); } sqlite3_close(contactDB); }
  • CoreData提供了一种“对象-关系映射”的效应,能将OC对象转变成数据,保存Sqlite中。

  • CoreData的补益正是能够合理管理内部存款和储蓄器,幸免sql语句的麻烦。

  • CoreData构成

    • NSManagedObjectContext:被管制的多少上下文,首要成效:插入、查询、删除。
    • NSManagedObjectModel:数据库全体的表结会谈数据结构,包蕴各样实体的定义的新闻。首要意义就是足够实体、实体性质,创立属性之间的涉嫌。
    • NSPersistentStoreCoordinator长久化存储助理对象,也就是数据库的连接器。首要效用正是安装存款和储蓄的名字、地方、存款和储蓄情势。
    • NSFetchRequest相当于select言语。查询封装对象。
    • NSEntityDescription实体构造对象,也正是表格结构。
    • 后缀为xxx.xcdatamodeld文件,编写翻译后为xxx.momd的文件。
  • 创建筑工程程的时候,勾上Use Core Data。如图所示:

图片 4创办项目

  • 创建完后,其实AppDelegate里面已经转移好了CoreData代码。
#import <CoreData/CoreData.h>@interface AppDelegate : UIResponder <UIApplicationDelegate>@property (strong, nonatomic) UIWindow *window;//上下文@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;//管理数据模型@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;//持久化的数据的对象@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;/** * 保存上下文 */- saveContext;/** * 获取documents路径 * * @return <#return value description#> */- applicationDocumentsDirectory;@end
  • 成立实体对象,并增添属性。

图片 5创设实体

  • 制造实现布局如下:

图片 6实体构造

  • 创造模型。选用途目->右击->New File...->iOS 下边包车型大巴Core Data->NSManagedObject subclass->选择CoreData文件点击Next->接纳要扭转的目的模型,点击Next->Create。具体操作如下截图:

图片 7创办模型图片 8创建类图片 9选取要扭转的CoreData文件图片 10选料要转移的靶子图片 11扭转好的模型

实际落到实处代码如下:

  • 保留数据
- (NSManagedObjectContext *)context{ AppDelegate *app = [UIApplication sharedApplication].delegate; return app.managedObjectContext;}

 //创建Person对象 /* insertNewObjectForEntityForName:就是创建的实体名字。 inManagedObjectContext:上下文,appDelegate里面已经创建完成。 */ Person *person = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:[self context]]; //赋值 [person setValue:@"小王" forKey:@"name"]; [person setValue:@ forKey:@"age"]; //保存 if (![[self context] save:nil]) { //TODO:保存失败 }
  • 查询
 //创建查询对象 NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Person"]; #if 0 //条件查询 //NSPredicate *predicate = [NSPredicate predicateWithFormat:@"age<=35"]; //查询名字带有王的 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name like[cd]'*王*'"];//设置查询条件 request.predicate = predicate;#endif //排序 NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:NO]; //设置排序条件 request.sortDescriptors = @[sort]; //执行查询 NSArray *objectArray = [[self context] executeFetchRequest:request error:nil]; //遍历查询结果 for (Person *p in objectArray) { NSLog(@"%@ - %@",[p valueForKey:@"name"],[p valueForKey:@"age"]); }
  • 修改
 //先查询要修改的对象 NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Person"]; //设置查询条件 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name='小王' and age = 35"]; request.predicate = predicate; //执行查询 NSArray *objectArray = [[self context] executeFetchRequest:request error:nil]; //遍历要修改的对象 for (Person *p in objectArray) { //修改(修改内存数据,没有同步数据库) [p setValue:@ forKey:@"age"]; } //同步数据库 [[self context] save:nil];
  • 删除
 //查询要删除的数据 NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Person"]; //设置查询条件 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name='小王'"]; request.predicate = predicate; //执行查询 NSArray *objectArray = [[self context] executeFetchRequest:request error:nil]; //遍历删除 for (Person *p in objectArray) { //删除内存中的数据 [[self context] deleteObject:p]; } //同步数据库 [[self context] save:nil];
  • 当app更新版本,何况表布局有涂改,必要版本进级和数量迁移操作,不然app就是崩掉。具体操作景况作者的简书:

  • CoreData最重大的是涉及,由于时间涉及,先不打理,后续再补上哈,请继续关心。

  • 钥匙串(匈牙利(Magyarország卡塔尔语: KeyChainState of Qatar是苹果公司Mac OS中的密码管理连串。
  • 一个钥匙串能够包含七种类型的数码:密码(饱含网址,FTP服务器,SSH帐户,网络分享,有线互联网,群组软件,加密磁盘镜像等),私钥,电子证书和加密笔记等。
  • iOS的KeyChain服务提供了一种安全的保存私密新闻(密码,种类号,证书等)的章程。各个iOS程序都有三个独自的KeyChain存款和储蓄。从iOS 3.0方始,跨程序分享KeyChain变得实惠。
  • 当应用程序被删去后,保存到KeyChain里面包车型大巴多寡不会被剔除,所以KeyChain是保存到沙盒范围以外的地点。
  • KeyChain的具备数据也都以以key-value的款式储存的,那和NSDictionary的仓库储存情势同样。
  • 相比于NSUserDefaults来讲,KeyChain保存更为安全,何况KeyChain里面保存的数额不会因为app删除而遗失。

摩托罗拉沙盒模型的有八个公文夹,分别是documents,tmp,app,Library。1、Documents 目录:应用程序数据文件在此个目录下。这些目录用于存款和储蓄顾客数据或别的应该准时备份的新闻。
2、AppName.app 目录:那是应用程序的程序包目录,包涵应用程序的自己。不可能开展改正,不然程序不会运作。
3、Library 目录:那些目录下有四个子目录:Caches 和 PreferencesPreferences 目录:包涵应用程序的偏爱设置文件。不能够直接创建偏幸设置文件,而是应当利用NSUserDefaults类来得到和安装应用程序的偏心属性.Caches 目录:用于寄放慢存文件,保存应用程序再度启航进程中须求的新闻。SDWebImage第三方库的缓存新闻管理都在这里个文件中,一般的大体积文件都位居此处。
4、tmp 目录:这几个目录用于寄存一时文件,保存应用程序再次运转进度中无需的新闻。Nsuserdefaults保存的文书通常在tmp文件夹里。

1.NSUserDefaults不能够保留自定义对象。

主题选拔

为了使用方便,大家采用github上包裹好的类KeychainItemWrapperSFHFKeychainUtils

  • KeychainItemWrapper是苹果封装的类,封装了操作KeyChain的基本操作,下载地址:
// 初始化一个保存用户帐号的KeychainItemWrapper KeychainItemWrapper *wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"Your Apple ID" accessGroup:@"YOUR_APP_ID.com.yourcompany.AppIdentifier"];//保存帐号[wrapper setObject:@"<帐号>" forKey:kSecAttrAccount]; //保存密码[wrapper setObject:@"<帐号密码>" forKey:kSecValueData]; 

//从keychain里取出帐号密码NSString *password = [wrapper objectForKey:kSecValueData];

//清空设置[wrapper resetKeychainItem];
  • 地点代码的setObject: forKey: 里参数forKey的值应该是Security.framework个汉语件SecItem.h里定义好的key

  • SFHFKeychainUtils是其它贰个第三方库,这几个类比KeychainItemWrapper要轻易超多,提供了更简短的点子保存密码到KeyChain,下载地址: 这些库是mrc,导入后也许会因为mrc会报错。

  • SFHFKeychainUtils就3个方法:

//获取密码密码 (NSString *) getPasswordForUsername: (NSString *) username andServiceName: (NSString *) serviceName error: (NSError **) error;//存储密码  storeUsername: (NSString *) username andPassword: (NSString *) password forServiceName: (NSString *) serviceName updateExisting:  updateExisting error: (NSError **) error;//删除密码  deleteItemForUsername: (NSString *) username andServiceName: (NSString *) serviceName error: (NSError **) error;
  • 参数表达

    • username:因为KeyChain保存也是以键值对存在,所以这些能够看成key,根据key取value.
    • forServiceName :这一个正是组的名字,能够知晓为KeyChain保存是分组保存。日常要独一哦,命名能够采纳YOU宝马X3_APP_ID.com.yourcompany.AppIdentifier。
  • 一经四个利用的usernameserviceName参数一样,那么那七个app会共用KeyChain里面包车型客车多寡,也等于能够分享密码。

  • KeyChain还也会有一个用处,就是顶替UDID。UDID已经被打消了,所以只好用UUID代替,所以大家得以把UUID用KeyChain保存。

 //创建一个uuid NSString *uuidString = [self uuidString]; //31C75924-1D2E-4AF0-9C67-96D6929B1BD3 [SFHFKeychainUtils storeUsername:kKeyChainKey andPassword:uuidString forServiceName:kKeyChainGroupKey updateExisting:NO error:nil];

-(NSString *)uuidString{ //创建一个uuid CFUUIDRef uuidRef = CFUUIDCreate(kCFAllocatorDefault); CFStringRef stringRef = CFUUIDCreateString(kCFAllocatorDefault, uuidRef); NSString *uuidString = (__bridge NSString *)(stringRef); CFRelease; return uuidString;}

2.相通保存顾客名,密码,设置项(是或不是记住密码、是还是不是在2G/3G电动下载图片,是还是不是离线下载等State of Qatar

NSUserDefaults>

  1. NSUserDefaults无法保留自定义对象。
  2. 平时保存顾客名,密码,设置项(是还是不是记住密码、是或不是在2G/3G机关下载图片,是或不是离线下载等卡塔尔国
  3. 保留基本数据类型NSString,NSArray,NSDictionary,用法轻易,日常保存一丢丢的数目。

NSArray和NSDictionary的嵌套是不得以做的

用法:

//保存

[[NSUserDefaults standardUserDefaults] setObject: forKey:];

//取值

[[NSUserDefaults standardUserDefaults] objectForKey:];

//立即保存

[[NSUserDefaultsstandardUserDefaults]synchronize];

//移除

[[NSUserDefaults standardUserDefaults] removeObjectForKey:];

3.保留基本数据类型NSString,NSArray,NSDictionary,用法不难,平常保存一些些的数据。

归档> 保存自定义的对象,何况也是保留少许数目。相对于在利用plist进行数量存款和储蓄和读取,只适用于系统自带的片段常用类型本事用,且必须先取得路线相对辛勤,且不能不存款和储蓄常用类型。

//需要实现NSCoding中的协议的两个方法

- (id)initWithCoder:(NSCoder *)aDecoder{

if (self == [super init]) {

self.name = [aDecoder decodeObjectForKey:Name];

self.sex = [aDecoder decodeObjectForKey:Sex];

self.age = [[aDecoder decodeObjectForKey:Age] integerValue];

}

return self;

}

- (void)encodeWithCoder:(NSCoder *)aCoder{

[aCoder encodeObject:self.name forKey:Name];

[aCoder encodeObject:self.sex forKey:Sex];

[aCoder encodeObject:[NSNumber numberWithInteger:self.age] forKey:Age];

}

//归档

NSMutableData *data = [[NSMutableData alloc] init];

//创建归档辅助类

NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];

//编码

[archiver encodeObject:model forKey:@"model"];

//结束编码

[archiver finishEncoding];

//写入到沙盒

NSArray *array =NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

NSString *fileName = [array.firstObject stringByAppendingPathComponent:@"archiverModel"];

if([data writeToFile:fileName atomically:YES]){

NSLog(@"归档成功");

}

//解档

NSData *undata = [[NSData alloc] initWithContentsOfFile:fileName];

//解档辅助类

NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:undata];

//解码并解档出model

TestModel *unModel = [unarchiver decodeObjectForKey:@"model"];

NSLog(@"%@",unModel);

//关闭解档

[unarchiver finishDecoding];

用法:

文本保留> 常常在iOS常用的是plist,平日也是保留少许数据。常常保存数据类NSArray,NSDictioanary.此文件包括了应用程序的布局音信.系统注重此文件以博取应用程序的相干信息


//保存

本文由新浦京81707con发布于注册购买,转载请注明出处:iOS中数据保存的方式分析,浅谈iOS本地数据保存

关键词: 新浦京81707con ios 数据 浅谈 iOS乱炖

上一篇:自动布局,史上最牛的自动布局教学

下一篇:没有了