//数据持久化的本质:将数据读取成文件保存在本地. 沙盒机制就是系统针对于每一个程序在本地生成的文件夹(名字随机生成), 对于不同的应用程序, 不能访问其他应用程序沙盒内的内容, 对于该应用程序内容起到保护作用:1 Documents:用来存储长久保存的数据 2 xxx.app:应用程序的包, 包含应用程序加载所需的所有资源(readonly只读, 不可修改), 平时使用的NSBundle就是该包 3 Library: 1) Caches:本地缓存, 存储想暂时保存的数据(Videos, Musics, Images) 比如:下载的视频, 音频, 图片都存储在该文件夹下 2) Preferences:存储用户的偏好设置, 比如程序是否是第一次启动 4 tmp:存储还未下载完的视频, 音频, 当下载完后, 将文件转移到Caches文件夹下
#import "WYLReadAndWriteViewController.h"
#import "WYLArchive.h"
@interface WYLReadAndWriteViewController ()<UITextFieldDelegate>
@end
@implementation WYLReadAndWriteViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
self.view.backgroundColor = [UIColor whiteColor];
self.navigationItem.title = @"文件读写";
UITextField *textField = [[UITextField alloc]initWithFrame:CGRectMake(40, 84, 220, 40)];
textField.tag = 100;
textField.placeholder = @"请输入内容";
textField.delegate = self;
textField.borderStyle = UITextBorderStyleRoundedRect;
[self.view addSubview:textField];
[textField release];
UITextField *textField2 = [[UITextField alloc]initWithFrame:CGRectMake(40, 174, 220, 40)];
textField2.tag = 101;
textField2.placeholder = @"显示上一个输入框的内容";
textField2.delegate = self;
textField2.borderStyle = UITextBorderStyleRoundedRect;
[self.view addSubview:textField2];
[textField2 release];
UIButton *writeButton = [UIButton buttonWithType:UIButtonTypeSystem];
writeButton.frame = CGRectMake(45, 260, 60, 30);
[writeButton setTitle:@"写入" forState:UIControlStateNormal];
[writeButton addTarget:self action:@selector(write:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:writeButton];
UIButton *readButton = [UIButton buttonWithType:UIButtonTypeSystem];
readButton.frame = CGRectMake(190, 260, 60, 30);
[readButton setTitle:@"读取" forState:UIControlStateNormal];
[readButton addTarget:self action:@selector(read:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:readButton];
UIButton *push = [UIButton buttonWithType:UIButtonTypeSystem];
push.frame = CGRectMake(120, 310, 60, 30);
[push setTitle:@"push" forState:UIControlStateNormal];
[push addTarget:self action:@selector(push:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:push];
}
- (NSString *)getFilePath
{
//用来获取指定文件夹的路径:<#NSSearchPathDirectory directory#>:指定的文件夹;<#NSSearchPathDomainMask domainMask#>:设置查找的域, 我们自己的文件都是存储在永华域的;<#BOOL expandTilde#>:是否使用详细路径(绝对路径) 因为最初该方法是使用与MAC OS下的, 而对于电脑系统来说, 可能会存储多个用户, 所以获取到得用户可能有多个, 所以返回值类型是数组, 但是对于iOS下, 就要只有一个用户, 所以数组中只有一个元素
/*
NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
//2)拼接上要存储文件的路径
NSString *newFilePath = [documentsPath stringByAppendingPathComponent:@"aa.txt"];
NSLog(@"%@", newFilePath);
*/
NSString *filePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
NSString *newPath = [filePath stringByAppendingPathComponent:@"test.txt"];
NSLog(@"%@", newPath);
return newPath;
}
- (void)read:(UIButton *)button
{
//每次写入都会将之前的内容覆盖掉, 若想保留之前的数据, 需要讲之前的数据读出, 然后将要存储的数据拼接在一起, 一起存入
/*
NSString *newFilePath = [self getFilePath];
NSError *error = nil;
NSString *content = [NSString stringWithContentsOfFile:newFilePath encoding:NSUTF8StringEncoding error:&error];
UITextField *tf = (UITextField *)[self.view viewWithTag:101];
tf.text = content;
*/
//字符串从本地读取
/*
NSString *filePath = [self getFilePath];
NSString *content = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
UITextField *tf = (UITextField *)[self.view viewWithTag:101];
tf.text = content;
*/
//数组从本地文件读取
NSString *filePath = [self getFilePath];
// NSArray *arr = [NSArray arrayWithContentsOfFile:filePath];
//从字典从本地读取
NSDictionary *dic = [NSDictionary dictionaryWithContentsOfFile:filePath];
UITextField *tf = (UITextField *)[self.view viewWithTag:100];
UITextField *tf1 = (UITextField *)[self.view viewWithTag:101];
tf.text = dic[@"tf2"];
tf1.text = dic[@"tf1"];
}
//文件读写暂时只支持:NSString, NSArray, NSDictionary, NSData, 以及他们的子类.写入文件:writeToFile:(这是对象调用的方法), 读取文件:每一个类自带的能够根据路径创建对象的方法:[类名 类WithContentsOfFile]; 字符串:[NSString stringWithContentsOfFile], 数组:[NSArray arrayWithContentsOfFile], 字典:[NSDictionary dictionaryWithContentsOfFile], 二进制流:[NSData dataWithContentsOfFile],(牢牢谨记:对于数组, 字典这样的容器类, 内部的成员也必须是能够实现文件读写的八大类之一)
- (void)write:(UIButton *)button
{
//写入时, 将第一个输入框中的文字, 写入到本地文件
//1 获取存储的内容
UITextField *tf = (UITextField *)[self.view viewWithTag:100];
NSString *content = tf.text;
//2 获取到所要存储的文件路径
//1)获取Documents文件夹路径
NSString *newFilePath = [self getFilePath];
//3 将内容存储到指定文件路径
// NSError *error = nil;
//字符串写入本地文件
// BOOL isSucceed = [content writeToFile:newFilePath atomically:YES encoding:NSUTF8StringEncoding error:&error];
//数组写入本地文件
UITextField *tf2 = (UITextField *)[self.view viewWithTag:101];
NSString *content1 = tf2.text;
// NSArray *arr = @[content, content1];
// BOOL isSucceed = [arr writeToFile:newFilePath atomically:YES];
//字典写入本地文件
NSDictionary *dic = @{@"tf1": content, @"tf2": content1};
BOOL isSucceed = [dic writeToFile:newFilePath atomically:YES];
NSLog(@"%d", isSucceed);
}
- (void)push:(UIButton *)button
{
WYLArchive *archivieVC = [[WYLArchive alloc]init];
[self.navigationController pushViewController:archivieVC animated:YES];
}
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
[textField resignFirstResponder];
return YES;
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
/*
#pragma mark - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
*/
@end
#import "WYLArchive.h"
#import "Person.h"
@interface WYLArchive ()<UITextFieldDelegate>
@end
@implementation WYLArchive
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
self.view.backgroundColor = [UIColor whiteColor];
self.navigationItem.title = @"归档与反归档";
UITextField *textField = [[UITextField alloc]initWithFrame:CGRectMake(40, 84, 220, 40)];
textField.tag = 100;
textField.placeholder = @"请输入内容";
textField.borderStyle = UITextBorderStyleRoundedRect;
textField.delegate = self;
[self.view addSubview:textField];
[textField release];
UITextField *textField2 = [[UITextField alloc]initWithFrame:CGRectMake(40, 174, 220, 40)];
textField2.tag = 101;
textField2.placeholder = @"显示上一个输入框的内容";
textField2.borderStyle = UITextBorderStyleRoundedRect;
textField2.delegate = self;
[self.view addSubview:textField2];
[textField2 release];
UIButton *fileButton = [UIButton buttonWithType:UIButtonTypeSystem];
fileButton.frame = CGRectMake(45, 260, 60, 30);
[fileButton setTitle:@"归档" forState:UIControlStateNormal];
[fileButton addTarget:self action:@selector(file:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:fileButton];
UIButton *archiveButton = [UIButton buttonWithType:UIButtonTypeSystem];
archiveButton.frame = CGRectMake(190, 260, 60, 30);
[archiveButton setTitle:@"反归档" forState:UIControlStateNormal];
[archiveButton addTarget:self action:@selector(archive:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:archiveButton];
}
- (NSString *)getPath
{
//获得文件夹的路径
/*
NSString *filePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
NSString *newPath = [filePath stringByAppendingPathComponent:@"archive"];
return newPath;
*/
NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
NSString *newPath = [path stringByAppendingPathComponent:@"archiver"];
return newPath;
}
- (void)file:(UIButton *)button
{
//获取输入框的内容
UITextField *tf1 = (UITextField *)[self.view viewWithTag:100];
UITextField *tf2 = (UITextField *)[self.view viewWithTag:101];
/*
//封装成Person对象
Person *person = [[Person alloc] initWithName:tf1.text gender:tf2.text age:18];
//1 创建归档对象
NSMutableData *data = [NSMutableData data];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
//2 归档
[archiver encodeObject:person forKey:@"person"];
[person release];
//3 结束归档, 当结束归档之后, 再归档无效
[archiver finishEncoding];
[archiver release];
//4 data写入文件
[data writeToFile:[self getPath] atomically:YES];
*/
Person *person = [[Person alloc] initWithName:tf1.text gender:tf2.text age:18];
NSMutableData *data = [NSMutableData data];
NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
[archiver encodeObject:person forKey:@"archiver"];
[person release];
[archiver finishEncoding];
[archiver release];
[data writeToFile:[self getPath] atomically:YES];
}
- (void)archive:(UIButton *)button
{
/*
//1 初始化NSMutableData对象
NSMutableData *data = [NSMutableData dataWithContentsOfFile:[self getPath]];
//2 创建一个反归档对象
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
//3 反归档
Person *person = [unarchiver decodeObjectForKey:@"person"];
//4 结束反归档
[unarchiver finishDecoding];
[unarchiver release];
*/
NSMutableData *data = [NSMutableData dataWithContentsOfFile:[self getPath]];
NSKeyedUnarchiver *unarchive = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
Person *person = [unarchive decodeObjectForKey:@"archiver"];
[unarchive finishDecoding];
[unarchive release];
UITextField *tf1 = (UITextField *)[self.view viewWithTag:100];
UITextField *tf2 = (UITextField *)[self.view viewWithTag:101];
tf1.text = person.gender;
tf2.text = person.name;
}
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
[textField resignFirstResponder];
return YES;
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
/*
#pragma mark - Navigation
// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
// Get the new view controller using [segue destinationViewController].
// Pass the selected object to the new view controller.
}
*/
@end
相关推荐
ios-解档归档.zip
不管类有多少个属性 只需要继承YBArchive这个类就可以了 就会把所有的属性都归档
iOS - 数据的归档和反归档
本篇文章主要介绍利用 NSKeyedArchiver 和 NSKeyedUnarchiver 对数据进行归档和反归档的操作。
Zynq裸机调试RTL8211FS网卡踩坑记:从ping不通到完美兼容的完整代码修改
本文详细记录了在Zynq平台上使用Xilinx SDK(XSDK)调试RTL8211FS网卡的完整过程,从最初的ping不通问题到最终实现完美兼容的解决方案。通过分析PHY芯片的寄存器配置差异,提供了关键代码修改和调试技巧,帮助开发者快速解决类似问题。
IOS 数据存储(NSKeyedArchiver 归档篇)
什么是归档 当遇到有结构有组织的数据时,比如字典,数组,自定义的对象等在存储时需要转换为字节流NSData类型数据,再通过写入文件来进行存储。 归档的作用 之前将数据存储到本地,只能是字符串、数组、字典、NSNuber、BOOL等容器类对象,不能将自定义对象进行保存,而通过归档能将所有的对象转化为二进制数据存储到文件中。 归档的缺点 归档保存数据,只能一次性归档保存以及一次性解压。所以只...
ESP32驱动TFT屏幕实战:LVGL与TFT_eSPI完美结合
本文详细介绍了如何在ESP32上结合TFT_eSPI驱动库与LVGL图形库,实现高效、流畅的嵌入式GUI开发。内容涵盖硬件连接、软件环境搭建、库配置、LVGL移植、界面创建及性能优化等全流程实战指南,帮助开发者快速构建低成本、高性能的交互式显示应用。
数字电视中的AD(Audio Description)音频描述技术详解
AD(Audio Description)音频描述是一种辅助技术,旨在帮助视障人士更好地理解视觉内容。通过在节目或视频的自然停顿处插入额外的语音叙述来解释屏幕上的视觉信息,如人物动作、场景变化、文字说明等,从而让视力受损的人士也能获得完整的观影体验。AD服务不仅限于电视广播,也广泛应用于电影、剧院表演、在线视频平台等领域。PID:用于标识和区分不同的音频流。PMT表:提供每个音频流的详细信息,包括PID、编解码器类型和语言代码。时间戳:PTS和DTS用于同步音频与视频内容。解复用。
【iOS】文件(对象数据)的归档和解档
本文对iOS开发中数据持久化方法之一 --- 归档解档进行了学习,包括对单个对象、自定义对象、多个对象的归档和解档
Codex 实战 Skills:编写 Skill 自动为 ESP32 芯片生成 MQTT 订阅与发布的基础代码
为了更清晰地展示 Skill 的工作原理和两种语言的差异,以下提供原理图和比对表格。本文深入探讨了如何利用 Codex 的 Agent 智能体技能(Skills)自动化 ESP32 与 MQTT 通信的代码生成过程。我们首先分析了 IoT 开发的痛点,然后详细设计了 Skill 的输入配置,并分别提供了 MicroPython 和 C++ 两种语言的完整代码实现。通过对比两种语言的优缺点,帮助开发者根据项目需求选择合适的语言。最后,我们提供了详细的运行指南,确保开发者能够快速上手。Skill 设计哲学。
IOS三种归档(NSKeyArchieve)的总结
IOS三种归档(NSKeyArchieve)的总结 归档是一种IOS中常用来存储文件的一种方法,在面向对象的语言中,归档也就实际上可以将一切对象存储在文件中,以下是IOS开发中常见的三种文件归档方式,分别是简单归档、data归档、自定义归档。现分别总结如下: 1、简单归档: 简单归档是指把简单的字符串、数组等对象进行归档。用到的方法是archiveRootObject,语句为...
OSG三维渲染引擎编程学习之一:“第一章:OSG介绍” 之 “1.1 OSG简介”
第一章:OSG介绍; 1.1 OSG简介。
公开 学生课堂行为数据集 SCB-Dataset: A Dataset for Detecting Student and Teacher Classroom Behavior
公开 学生课堂行为数据集 SCB-Dataset Student Classroom Behavior dataset
11.归档
归档,在其他语言中又叫“序列化”,就是将对象保存到硬盘;解档,在其他语言又叫“反序列化”就是将硬盘文件还原成对象。其实归档就是数据存储的过程,在IOS中数据的存储有五种方式: xml属性列表(plist归档) NSUserDefaults(偏好设置) NSKeyedArchiver归档(加密形式) SQLite3(嵌入式数据库) Core Data(面向对象方式的
流体动力学仿真软件:Star-CCM+_(1).Star-CCM+基础及入门
Star-CCM+的用户界面(UI)分为多个部分,包括菜单栏、工具栏、工作区、视图窗口和控制台。菜单栏包含文件、编辑、视图、工具等常用菜单。例如,“File”菜单可以用于打开、保存和退出项目。工具栏提供常用的工具按钮,如新建项目、打开项目、保存项目等。也可以自定义工具栏,添加常用的功能按钮。工作区显示当前项目的结构和各个对象。可以通过拖拽方式组织和管理项目中的各个部分。视图窗口显示几何模型、网格、结果等。可以通过不同的视图模式查看和分析数据。控制台显示软件的运行日志和输出信息。
iOS笔记—归档解档
ios数据持久化的一种方式。归档解档 // // main.m // NSKeyedArchiver // // Created by hhg on 15/9/10. // Copyright (c) 2015年 hhg. All rights reserved. // #import <Foundation/Foundation.h> int main(int ar...
Probability and Statistics - 4th edition
Probability and Statistics - 4th edition
OV9734 DATASHEET,完整规格书
OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等
iOS 数据持久化 (一)
iOS开发常用的数据持久化方式有NSUserdefaults(属性列表),NSKeyedArchiver(归档/解归档),write , SQLite 3, CoreData等。 ###1.【属性列表】 NSUserDefaults 是一个单例,整个程序中只有一个实例对象,用于数据的永久保存,也是使用最简单。 ⚠️支持的数据类型有:NSNumber,double,float,NSInteger,N...
文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况
主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。
ios 常用的持久化数据存储方式
1.plist文件存储 每个iOS应用都有自己的应用沙盒(应用沙盒就是文件系统目录),与其他文件系统隔离。应用必须待在自己的沙盒里,其他应用不能访问该沙盒 应用沙盒的文件系统目录,如下图所示(假设应用的名称叫Layer) 模拟器应用沙盒的根路径在: (apple是用户名, 6.0是模拟器版本) /Users/apple/Library/Application Supp...
iOS开发中的4种数据持久化方式【一、属性列表与归档解档】
iOS中的永久存储,也就是在关机重新启动设备,或者关闭应用时,不会丢失数据。在实际开发应用时,往往需要持久存储数据的,这样用户才能在对应用进行操作后,再次启动能看到自己更改的结果与痕迹。iOS开发中,我们需要数据持久化这一种技术,也需要不断在实际开发的工作与学习中完善数据持久化这一开发技术。 【本次开发环境: Xcode:7.2 iOS Simulator:iphone...
iOS 归档
#import <UIKit/UIKit.h> @interface AppDelegate : UIResponder <UIApplicationDelegate> @property (strong, nonatomic) UIWindow *window; @end #import "AppDelegate.h" #import...
iOS数据持久化——属性列表和归档
iOS数据持久化的方式分为三种 属性列表 (自定义的Property List 、NSUSErDefaults) 归档 (NSKeyedArchiver) 数据库 (SQLite、Core Data、第三方类库等) 本文只介绍:属性列表和归档 一. 属性文件(Plist) Plist一般用于存储Dictionary、Array、Boolean、Data、Date
NSKeyedArchiver/NSCoding归档(序列化)
IOS数据持久化的方式分为三种: 属性列表 (自定义的Property List 、NSUserDefaults)归档 (NSKeyedArchiver)数据库 (SQLite、Core Data、第三方类库等) 下面主要来介绍一个归档NSKeyedArchiver。 归档(又名序列化),把对象转为字节码,以文件的形式存储到磁盘上;程序运行过程中或者当再次重写打开程序的时候,可
项目实战:APP登入后,数据的持久化储存
项目的数据持久化存储很多:NSUserDefaults、解归档、SQLite和CoreData,根据不同需求选择其中一种吧。这里主要是讲解项目在登录成功后,储存个人信息,所以选择了NSUserDefaults和解归档 沙盒NSUserDefaults一、NSUserDefaults一般可以直接存储NSNumber(NSInteger、float、double),NSString,NSDate,NSA
iOS中常用的持久化存储方式
2019独角兽企业重金招聘Python工程师标准>>> ...
IOS 14.5版本之解档和归档的API学习
IOS 14.5版本之解档和归档的API学习 第一部分 回顾一下老api的使用,将对象持久化至硬盘里面。 1.为什么我们要学习解档和归档, 有什么作用。当 plist 文件存储无法满足我们的需求的时候,或者 用户偏好设置无法存储我们自定义的对象的时候,就需要解档和归档的知识上场了。首先我们体验一下IOS12之前API的 解档和归档的知识。IOS12之后,苹果替换了之前的写法了。 我们需要重写学习。不要念想之前的api函数,没有意义。苹果既然要废弃之前的写法,肯定有它的道理,无需深究。时代在进步,科技在进步。
iOS 数据持久化-归档
1.将任何对象,或数据结构转换为NSData类对象的过程,成为归档,亦称之为数据的序列化 2.解归档,首先要确保你有同样的数据结构来接收解归档的数据 需要归档的数据结构中,任何对象都必须遵从NSCoding,实现协议方法 - (void)encodeWithCoder:(NSCoder *)aCoder; // 归档时调用, - (id)initWithCoder:(NSCo
1387



被折叠的 条评论
为什么被折叠?



