OC语言--数据存储(归档&plist&Json)

1. 数据存储介绍

通常程序在运行过程中,或者程序结束之后,需要保存一些信息,而且需要持久化存储信息;比如登陆信息、视频播放记录、收藏记录等等;我们可以采用以下几种方式对数据进行持久化保存.

a.文件

b.plist

c.归档

d.NSUserDefaults

e.数据库

接下来只介绍Plist和归档这两种方式。

2. 属性列表文件  Plist(Property List)

(1)什么是plist文件, plist文件的作用

a. plist文件: property list  属性列表文件,文件的内容只能是 NSString NSNumber NSDate NSData NSArray NSDictionary类的对象内容,不能保存其他类型数据。

b. 作用: 对一些登陆注册信息 或者程序的配置信息(小数据)进行持久化存储。

(2)如何创建plist文件, 如何编辑plist文件

Plist文件内容的格式是XML语法格式;

a. 用代码创建 Plist 文件

如果要把 NSString NSNumber NSDate NSData NSArray NSDictionary 的对象写入文件,一般就用plist文件;

我们需要先将这些数据保存到一个数组或者字典中,然后调用数组和字典的相关函数, 把数组NSArray或者字典NSDictionary,写入plist文件;

//NSArray和NSDictionary写文件方法

- (BOOL)writeToFile:(NSString *)path 

atomically:(BOOL)useAuxiliaryFile;

(3)如何在程序中读取plist文件数据

Plist文件的根节点(数据的最外层)通常是数组或者字典;

1.如果Plist文件的根节点是字典,

那么使用字典的类方法

+ (id)dictionaryWithContentsOfFile:

(NSString *)path;

来读取Plist文件;

2.如果根节点是数组,

那么使用数组的类方法

+ (id)arrayWithContentsOfFile:

(NSString *)path;

来读取Plist文件;

注: 上述两个方法只能读取Plist文件,不能读取其他格式的文件。

3. 文件归档 

(1)什么是归档和解档

a. 归档(也称对象序列化,对象持久化存储)就是用某种打包格式将对象保存到本地的文件,以便以后读回该对象的内容

b. 解档(也称归档/读档)就是把归档的对象文件,读成原来的对象的过程。

-》 如何归档和解档

a. 系统类的归档和解档

// 序列化 数组归档

        NSArray *array = @[@"xiaohong",@"iOS",@123];

        NSString *path = @"/Users/sub/Desktop/data.archive";

//归档过程

        BOOL success = [NSKeyedArchiver archiveRootObject:array toFile:path];

        if (success){

            NSLog(@"归档成功");

              }else{

            NSLog(@"归档失败");

       }

        // 反序列化 解档

        NSArray *newArray = [NSKeyedUnarchiver unarchiveObjectWithFile:path];

         NSLog(@"%@", newArray);

注: NSDictionary也可以直接进行归档和解档 ;归档的对象包括这个对象中的属性,它们所属类的都必须要遵守NSCoding归档协议才能归档和解档;

b. 自定义类的归档和解档

如果自定义的类对象要进行归档,那么这个对象的属性所属的类也必须要遵守归档协议NSCoding,必须实现以下两个方法:

//归档的时候调用的方法

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

//解档的时候要调用的方法

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

eg.示例部分代码

#import <Foundation/Foundation.h>
#import "Student.h"

int main(int argc, const char * argv[])
{

  @autoreleasepool {
#if 0
      //系统类型的归档和解档操作
    NSDictionary* aDic = [[NSDictionary alloc]initWithObjectsAndKeys:@"hello",@"one",@"haha",@"two", nil];
    NSString* path = @"/Users/sub/Desktop/aDic.archive";
      //系统类的对象归档
    [NSKeyedArchiver archiveRootObject:aDic toFile:path];

    NSDictionary* bDic = [NSKeyedUnarchiver unarchiveObrunjectWithFile:path];

    NSLog(@"bDic:%@",bDic);
    NSLog(@"aDic:%@",aDic);
#endif

    Student* aStu = [[Student alloc] init];
    NSLog(@"aStu:%@",aStu);

    NSString* path = @"/Users/sub/Desktop/aStu.archive";

    [NSKeyedArchiver archiveRootObject:aStu toFile:path];

    Student* bStu = [NSKeyedUnarchiver unarchiveObjectWithFile:path];
    NSLog(@"bStu:%@",bStu);

  }
    return 0;
}

4.  Json 存储

(1)什么是JSON

JSON是一种轻量级的数据交换格式,JSON语法是 JavaScript 语法的子集;

JSON 数据的书写格式是:名称:值   构成键值对。(类似于OC字典的键值对)

(2)JSON的基本语法

名称/值对  包括字段名称(在双引号中),后面写一个冒号,然后是值。如 "firstName":"tom"

JSON的值可以是:

a. 数字 (整数或浮点数)

b. 字符串 (在双引号中)

c. 逻辑值 (true 或 false)

d. 数组 (在方括号中)

e. 对象 (在花括号中)

f.   null

(3)JSON结构

JSON有数组和字典两种结构;通过这两种结构可以表示各种复杂的结构;

a. 数组:

数组在js中是中括号“[]”括起来的内容,数据结构为 [“Js”, "javascript", "vb”,“vc”,…],类似于OC中的数组.

b. 对象:

对象在js中表示为“{}”括起来的内容,数据结构为 {key:value, key:value, ...}的键值对的结构,类似于OC中的字典;

(4)JSON解析

假如本地有一文件内容的格式是JSON格式。

a. 首先调用

+ (id)stringWithContentsOfFile:(NSString *)path

encoding:(NSStringEncoding)enc

error:(NSError **)error;把文件读成字符串.

b. 然后把字符串转化为NSData 二进制数据;

c. 调用  系统类NSJSONSerialization的

+ (id)JSONObjectWithData:(NSData *)data

options:(NSJSONReadingOptions)opt

error:(NSError **)error;

进行解析,最后解析为NSArray 或者NSDictionary

注:

JSON数据的最外层通常是字典或者数组,字典结构居多。使用NSJSONSerialization来解析json 数据,解析出来是OC中的NSArray 或者NSDictionary。

eg.示例代码

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])
{

  @autoreleasepool {
      //第一步:读取 json 格式文件,变成字符串
    NSString* json_des = [NSString stringWithContentsOfFile:@"/Users/sub/Desktop/jiexi_json.txt" encoding:NSUTF8StringEncoding error:nil];
      //第二步:将上述字符串,转成 NSData对象
    NSData* aData = [json_des dataUsingEncoding:NSUTF8StringEncoding];
      //第三步:将 NSData 对象,提交给 JSON 解析器解析
    NSDictionary* json_dic = [NSJSONSerialization JSONObjectWithData:aData options:NSJSONReadingMutableContainers error:nil];
      //使用 for-in 循环结构,遍历打印字典
    for ( NSString* key in json_dic){
      NSLog(@"Key:%@ -> Value:%@ ",key,[json_dic objectForKey:key ]);
    }

  }
    return 0;
}
时间: 2024-10-16 10:18:14

OC语言--数据存储(归档&plist&Json)的相关文章

Unity本地数据存储---Sqlite和JSON

2014-04-30更新 剔除了使用网络上烂大街的SQLite使用方法(原因android下无法读取数据),使用libSQLite3.so,通过DLLImport,在C#代码里直接调用C接口 这种原生调用SQLite的方式,我在pc.android上亲测无误,ios没测过,但是stackoverflow上有兄弟试过,没问题.园子的朋友如果可以测IOS的,欢迎提供结果 基本思路,游戏基础配置数据,比如怪物的属性.装备模板属性.关卡怪物等,使用SQLite(Unity插件SQLiteUnityKit

C语言 数据存储方式

C语言 数据存储方式 一.源码 一个数的原码(原始的二进制码)有如下特点: 最高位做为符号位,0表示正,为1表示负 其它数值部分就是数值本身绝对值的二进制数 负数的原码是在其绝对值的基础上,最高位变为1 下面数值以1字节的大小描述: 十进制数 原码 +15 0000 1111 -15 1000 1111 +0 0000 0000 -0 1000 0000 注:原码表示法简单易懂,与带符号数本身转换方便,只要符号还原即可,但当两个正数相减或不同符号数相加时,必须比较两个数哪个绝对值大,才能决定谁减

数据存储之plist、偏好设置

// 偏好设置--------------------------------- // 存储基本类型数据 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; [defaults setObject:@"hello world!" forKey:@"testsavekey"]; // 强制保存,否则需要等系统保存,时间不定 [defaults synchronize]; // 取数据 NS

Unity3d数据存储 PlayerPrefs,XML,Json数据的存储与解析

今天来复习一下数据存储方面的基础知识,Unity3d中常用的数据存储方式有Unity自带的PlayerPrefs, XML文档, Json文档,还有常用的轻量级数据库SQL, 涉及的琐碎知识非常多,在这里自己归纳总结一下,方便日后温故而知新. PlayerPrefs存储数据 PlayerPrefs的存储方式非常简单,但可用性不强,一般只用于调试过程存储少量数据,很少大范围使用 适用设备:Mac OSX, Linux, Windows,Web Players 存储机制:Key-Value (类似于

数据存储-自定义Json串写入文件与XML格式读取数据

数据存储总的来说有三种方式 1>,数据库 2>,文件 3>,网络 在这里我介绍的是Json格式与XML格式的文件存储 先说说常用的文件存储数据的格式 1>,Json格式 2>,XML格式 这俩种格式我觉得区别的话应该是Json适合存储小数据,XML适合存储大数据 在cocos2d-x中,如果我们要用Json首先我们要先导入一个Json库:libjson demo如下: 要添加libjson头文件 创建Json格式的数据: 这里用JSONNode,定义一个父节点n,再定义一个节

iOS开发:数据存储之plist文件操作

1.plist,全名PropertyList,即属性列表文件,它是一种用来存储串行化后的对象的文件.这种文件,在ios开发过程中经常被用到.这种属性列表文件的扩展名为.plist,因此通常被叫做plist文件.文件是xml格式的.Plist文件是以key-value的形式来存储数据.既可以用来存储用户设置,也可以用来存储一些需要经常用到而不经常改动的信息. 在对plist文件的操作有创建,删除,写入和读取.这四种操作中,写入和读取是比较常用的操作. 2.下面我对这四种操作进行一一的陈述. 首先,

iOS -- 图片浏览器3(将数据存储到plist文件中)

// 将数据存入plist文件中#define IconKey @"icon"#define DescKey @"desc"#import "ViewController.h"@interface ViewController ()- (IBAction)previous;- (IBAction)next;@property (weak, nonatomic) IBOutlet UIButton *previousBtn;@property (w

爬虫学习之第三章数据存储

第三章 数据存储 第一节 json文件处理: 什么是json: JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式.它基于 ECMAScript (w3c制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据.简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言. 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率.更多解释请见:https://baike.baidu.com/item/JS

用scrapy爬取ttlsa博文相关数据存储至mysql

运维生存时间这个博客内容还是比较详尽的,对与运维技术人员的我来说,是偶尔溜达进来的地方,从中也学习到不少知识,感谢博主的奉献! 这段时间我就通过scrapy来收集下此博客内文章的相关数据,供以后需要从中提取我认为值得看的文章作为数据依据. 今天,要做的事就是把数据先抓取出来,后期再将其数据存储起来. 首先通过命令scrapy genspider ttlsa www.ttlsa.com创建一个蜘蛛程序应用名为ttlsa 其次在ttlsa.py下编写如下代码. # -*- coding: utf-8