当前位置:首页 » 存储配置 » ios开发数据存储

ios开发数据存储

发布时间: 2022-12-09 03:47:14

‘壹’ iOS开发怎么获取本地数据和把数据存储到本地

一般获取本地数据是从plist文件中读取JSON数据。
读取数据:
NSString
*plistPath
=
[[NSBundle
mainBundle]
pathForResource:@"city"
ofType:@"plist"];
NSArrary
*cityArray
=
[[NSArray
alloc]initWithContentsOfFile:plistPath];
这里的cityArray根据你存在plist中的数据类型来确定,如果plist中是字典类型,那么你这里需要使用NSDictionary去存储你从plist中获取到的数据。
至于本地存储数据的话根据你项目的具体功能来设计,一般的小型数据如用户昵称、手机号等使用NSUserDefault即可,但是如果是大量数据如账单类app中的账单数据那么此时需要考虑使用sqlite3去存储数据,至于密码之类就需要使用NSKeydArchiver去存储。

‘贰’ 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开发中关于用户信息的存储的思考

之前项目中在展示用户数据的时候都是先直接从网络获取,然后再展示,之所以这样做而不将用户数据存储到本地再展示的原因是当时考虑到如果用户在其他设备上对该用户的数据进行了修改那么原来设备上用户信息的展示就会出错,还是从网络获取的数据可靠。(存储到本地同样能正确展示用户数据,只怪自己当初没深入思考过这个问题)

先从网络获取用户数据再展示用户数据会有一个问题,由于网路请求数据是需要一定时间的,这样当我打开一个包含用户数据的页面的时候会有片刻时间无法看到用户的数据,尤其在这个页面包含用户头像的时候这个效果(闪屏)更加明显,给用户的体验不是很好。

我们可以在项目中创建一个存储用户信息的类,这个类可以将用户信息存储到本地,在展示用户数据的时候 先从本地去取数据 这样就不会有之前片刻时间看不到用户数据的闪屏效果, 再从网络上获取数据同时将数据存储到本地,再重复从本地取的操作(这样能保证数据是最新的,不会出错) 。

存储用户数据到本地有三个要点需要注意:

这个存储用户数据的类相当于一个中介,在从网络获取到数据时并没有直接去展示用户数据而是先将数据放到了中介中,在展示用户数据的时候再去这个存储了用户数据的中介中去取数据。

本篇文章到这里就结束了,愿大家加班不多工资多,男同胞都有女朋友,女同胞都有男朋友。😊

‘肆’ iOS开发怎么获取本地数据和把数据存储到本地

一般获取本地数据是从plist文件中读取JSON数据。
读取数据:
NSString *plistPath = [[NSBundle mainBundle] pathForResource:@"city" ofType:@"plist"];

NSArrary *cityArray = [[NSArray alloc]initWithContentsOfFile:plistPath];
这里的cityArray根据你存在plist中的数据类型来确定,如果plist中是字典类型,那么你这里需要使用NSDictionary去存储你从plist中获取到的数据。

至于本地存储数据的话根据你项目的具体功能来设计,一般的小型数据如用户昵称、手机号等使用NSUserDefault即可,但是如果是大量数据如账单类app中的账单数据那么此时需要考虑使用sqlite3去存储数据,至于密码之类就需要使用NSKeydArchiver去存储。

‘伍’ iOS存储技术-Keychain

钥匙串这个技术大家每天都在用,它相当于一个容器,里面有已加密的和未加密的用户信息,它是怎么实现安全储存Mac、App、服务器和网站的帐户,开发过程中又该怎么使用这个技术呢。通过一个例子来介绍一下:

用户要登录你的APP,这个时候用户在文本框输入了他的用户信息和密码,那么你该如何存储这个信息?自然我们会有一个类似用户的结构来存储用户信息

这个结构里有一个String类型的用户名称和一个String类型的密码变量, 张三输入了它自己的用户名“zhangsan”和密码“******”来登陆,那么我们就会有一个生成用户的过程

那么接下来你希望存储到Keychain中,Keychain有哪些方法呢?第一步自然是添加

函数有三个参数,但是每个似乎都不认识,所以我们先简单看一下这三个参数要做什么

第一个参数是个字典,那自然是由许多key-value构成,首先它要包含一个这个数据的类型,数据类型使用kSecClass来做key,kSecClass的定义:

可以看到kSecClass是一个CFString类型的全局变量,它其中可用的值由Item Class Keys and Values列出。根据数据类型的不同有不同的值,例如密码、认证,对于密码它的值定义为:

也是一个CFString类型的变量, class对应的值会决定数据是否被加密,当选择这个password的时候数据就会被加密。那么我们字典中的第一个key-value对就有了:

那么这个字典还需要包含什么呢? 账号:也就是这个数据是谁的数据,这个属性由kSecAttrAccount这个Key来定义,同样它也是一个CFString类型的Key,它的值是你自定义的一个CFString类型的值。当然这个属性并不是必须的,于是字典中的第二个key-value对也有了

⚠️注意

字典中除了用户名还需要用户的数据,数据使用kSecValueData这个Key来定义,同样是CFString类型的Key,但是用户的数据可能多种多样,所以它的值类型是CFData。那么就需要把用户的信息加工一下

这样就得到了字典中第三个key-value对:

既然是钥匙串,那就不能随时随地访问,需要访问控制权限,所谓访问控制就是你希望当iPhone解锁的时候,或者是验证了用户的指纹之后才能继续进行的过程。权限由kSecAttrAccessControl这个Key来表示,它所对应的值是一个SecAccessControl的实例,而SecAccessControl又是什么?

它就是一个包含Keychain对象怎么被使用的信息的一个不透明类型,来看看它的实例化

它通过(CFAllocatorRef allocator, CFTypeRef protection, SecAccessControlCreateFlags flags, CFErrorRef _Nullable *error)函数来创建
函数有四个参数:
1.第一个参数是用来初始化SecAccessControlRef对象的. 我们可以传 NULL 或者kCFAllocatorDefault
2.第二个参数是控制设备什么情况下可以访问这个Keychain信息, 它的值可以是添加Keychain函数的第一个参数字典中的一个其它key(kSecAttrAccessible)对应的值,例如可以控制当设备解锁的时候使用的值:: CFString。其它可使用的还有(只有这台设备且设置了密码)、(只有这个设备第一次解锁后)。
3.第三个参数是一组额外的访问控制:用来控制用户级别的访问权限,如果设备没有密码总是处于unlocked的状态,你可能希望进一步限制KeyChain访问。例如在获取银行账户的认证时候,需要在获取认证信息之前验证是不是授权用户在操作,这使得KeyChain可以根据用户的输入来管理对Keychain的访问,可以选择devicePasscode来限制需要用户需要输入密码或者是选择userPresence来让系统根据当前状态选择一种验证方式或者是多种方式的组合
第四个是失败原因的一个指针,这里暂时传一个nil值
所以我们可以通过来获得一个访问控制的参数

⚠️注意

现在我们可以回到之前创建函数的第一个参数字典的分析了,我们得到了
SecAccessControl的实例,所以字典的第四个key-value对也有了:

现在字典中有了数据的类型、哪个用户的数据、用户要存储的数据、什么条件可以访问这个数据。看起来不缺少什么了。我们的一个字典参数就处理好了:

函数会通过第二个参数来返回新添加的Keychain,具体的类型是根据第一个参数中指定的返回类型决定的(例如可以通过kSecReturnData这个可以指定返回类型为CFData) 当然,通常我们可以忽略这个返回的数据,所以可以传一个nil值
函数还有一个返回值,从声明上看是一个OSStatus类型的值,相应的定义在Security Framework Result Codes中,常见的值有:

我们通常需要将返回值和已知的返回值相比较来判断是否操作成功了,也就是我们通常可以使用如下的语句来处理添加操作

至此,添加操作就完成了。

查询主要使用SecItemCopyMatching(CFDictionaryRef query, CFTypeRef _Nullable *result)函数,函数会返回一个或者多个item,或者是指定的item属性的,默认情况下只会返回匹配的第一个结果。

函数的第一个参数就是和添加Keychain函数的参数一样的结构,通常有Keychain的class也就是由kSecClass为Key的一个key-value对。
属性:属性就是Keychain结果需要符合的条件,例如想查找哪个用户的数据,查询参数还可以带控制返回的key,因为添加方法和查询方法都会返回结果的数据和属性到提供的参数指针里,所以可以指定返回的key来控制指针对应的返回数据的格式,也就是通常的密码查询应该包含kSecReturnData为Key的key-value对。
例如可以使用kSecReturnPersistentRef这个Key来获得一个CFData的引用,然后可以把它存储在磁盘或在进程间传递,可以在这之后调用另一个SecItemCopyMatching函数将持久化引用转为常规引用,函数参数里需要将持久化的引用的数组作为kSecMatchItemList的值传入。如果使用kSecReturnData来控制返回data本身,搜索会返回一个代表实际数据的CFData,这个就是典型的密码Keychain的使用方式。同时,Keychain服务会在返回给你之前对数据进行解密
搜索参数:这个参数可以包含一些结果的数量条件,控制string属性是否大小写敏感等。
所以,希望查询上面的用户信息的时候查询字典参数会如下所示

函数的第二个参数是一个CFTypeRef类型的接收函数返回的指针,我们需要先定义一个这样的指针:

同样我们需要判断函数返回值是否成功:

因为查询字典参数里携带了kSecReturnData,所以这个指针指向的数据类型是一个CFData类型的参数,我们需要获取对应的值

这样 str就是我们之前存储在KeyChain中的用户信息了
至此,Keychain的添加和删除都已经具备了,基本的用户需求就解决了。

除了基础的使用之外,我们还可以

这些,下次再说吧

‘陆’ iOS开发-iCloud环境配置及使用

配置iCloud,首先你就先要有一个真实的苹果开发者账号,没错,就是一年688的那个。开通了之后,在Xcode中新建一个项目。然后在 TARGETS -> Capabilities -> iCloud 中打开开关就可以了。

就像这样,是不是很简单啊。

诶,可是好像有什么地方不对,有些地方爆红了。

这是因为我们还没有给这个App ID 注册,所以接下来我们去苹果的 开发者官网 添加一个App ID,在添加的时候勾选 iCloud 服务就可以啦。

什么?你说你已经创建过App ID了???没关系,在管理App ID这边选择 Edit ,然后在勾选 iCloud 也是一样的。

这时候回到Xcode中在看一下,应该就已经没有爆红了吧。

什么???还有爆红??? 那你重启一下XCode试试吧。再不行,你重启一下电脑试试好了。

在Xcode中 iCloud 下边一共有三个可以勾选的服务,其中第一个就是 key-value storage ,这个也是最简单的 iCloud 使用方法了,他跟 NSUserDefaults 的使用方法基本一样,都是以键值对的方式存储数据。只不过处理iCloud的类为 NSUbiquitousKeyValueStore 。

存储数据的方式很简单,只要使用 setObject:forkey: 之后,使用 synchronize 同步一下就可以了。

获取数据的方式也一样,是要使用 objectForKey 就可以了。

看一下 NSUbiquitousKeyValueStore 的头文件,我们发现他还有一个通知消息

注册这个通知,就可以在数据修改的时候接收到通知,然后做对应的处理。最好的验证方法就是在存储了数据之后直接删除掉这个app,然后再次安装,这个时候就会触发该通知。

先放一下demo的[ 地址 。

以上就是关于配置iCloud和key-value存储的简单使用,后边我们再看看其他两种服务是怎么样使用的。

相较于key-value的存储类型,Documents是用来管理一些比较大的文件,比如用户创建的文档等等。

在我们打开iCloud选项的时候,系统就是自动为我们添加一个 xxx.entitlements 的文件,这个东西用来保证应用的安全性,确保只有你的应用才能访问你自己创建的文档,系统也是依赖于他来区分用户的iCloud账户中每个应用的文档。

查看这个 xxx.entitlements 我们会发现在他里边有这样的一个key Ubiquity Container Identifiers ,对应的value为 iCloud.$(CFBundleIdentifier) 。其实这个 $(CFBundleIdentifier) 就代表这你的APP ID。所以也可以看成是 iCloud.com.zzr.ZZRiCloudDemo 。

NSFileManager 主要是对文件的操作,我们用它来获取iCloud的存储地址。

根据我们的entitlements,通过 NSFileManager 就可以获得iCloud的存储地址,在获取地址之后,我们要先判断一下获取的地址是否为空,如果这个地址为空,则说明用户的iCloud暂时不可用,接下来一切的操作都没办法进行下去。

UIDocument 主要是用于对文件内容的操作。

其实获取了文件的地址之后,我们已经可以直接对文件进行操作了,但是官方还是让我们通过 UIDocument 来操作,因为当我们在对iCloud进行操作的时候,不止是只有我们自己对他进行操作, iCloud daemon 也会对iCloud操作,用 UIDocument 操作能够保证存取安全。

在使用 UIDocument 之前,我们新建一个类,继承于 UIDocument ,并且重写两个方法:

NSMetadataQuery 主要用来查询数据。

有了之前的准备工作,创建一个文档就非常简单了,只要创建好我们要保存的文件,通过

就可以将文档上传到iCloud中了。

我们以一个txt文件作为示范。

修改文档,其实就是重写文档,就是将上边创建文档中的 UIDocumentSaveForCreating 改为 UIDocumentSaveForOverwriting 。

删除文档其实就是通过之前的地址获取到文件,然后调用remove方法即可。

之前讲了增加、删除、修改,好像增删改查中只剩下查询这个方法没有介绍了。查询和前边几个有点不同,他需要用到 NSMetadataQuery 。

直接调用 startQuery 开始查询,iCloud就已经开始帮我们查询了,查询好之后,iCloud会通过通知来告诉我们查询到了东西。

所以我们注册两个通知

并相应他们

其中

就是查询到的内容的数组,遍历他,就可以获取到对应目录下的全部文件了。

先放一下demo的 地址 。

demo简单的制作了一个text文档的存储功能,一些交互没有完善,但是基本的增删改查功能都已经实现了。

以上就是 iCloud Document 的简单使用。此文章仅供个人学习使用,如有不当,希望大佬指出。

‘柒’ ios数据的持久化存储方式有哪些

对于数据的持久化存储,ios中一般提供了4种不同的机制。
1.属性列表
2.对象归档
3.数据库存储(SQLite3)
4.苹果公司提供的持久性工具Core
Data。
其实储存的形式无非就这么几种,而我们还必须要关心的是,这些文件会被放置在那个文件下,然后如何读取。
也就是说:IOS上数据存储,我们要了解的两点,数据存储格式(也就是存储机制),数据存储位置。
1》文件如何存储(如上面4点)
2》文件存储在哪里。
对于数据的操作,其实我们关心的是操作的速率。
就好比在Adnroid中偏好存储,数据库存储,io存储一样。

‘捌’ 怎样实现IOS开发中的数据存储方式

iOS 开发中一般有如下几种数据存储方式,需要根据具体的业务场景,选择合适的数据存储方式。

  1. 用户默认设置 – 这种情况通常不需要用户干预,如游戏通关信息,Video播放记录,退出之后下次进入时恢复到退出时的情况。

  2. 设置束提供了一个通过 iPhone、iPad的设置应用程序进行配置的接口。

  3. 直接访问文件系统读写属于当前App的iOS文件系统部分的文件。

  4. SQLite 数据库是嵌入式的和轻量级的SQL数据库,SQLite 是由C实现的。

  5. 远端数据库这个一般由App调用远端的RESTFulWCF服务,将JSON、XML 数据传递给远端的 Web 服务,读写数据库的逻辑完全在 Web 服 务端实现。

‘玖’ IOS开发数据存储有哪几种方式

简单的数据,对安全性要求不高的数据可以使用 NSUserDefaults (本质上是一个plist)来存储

相对复杂点的数据,可以使用coredata (本质上是使用sqlite 来存储)
对安全性要求较高的数据,可以使用keychain 来存储。

‘拾’ iOS开发小技巧--userdefault存储复杂数据(image为例)

一、 首先简述一下 Userdefault (介绍使用了该作者的文章)

1.适合存储轻量级的本地数据。

比如用户id  用户的登录token什么的  这种比较短小的数据

2.NSUserDefaults支持的数据格式有:NSNumber、NSData、NSDate、NSString、NSArray、NSDictionary、BOOL。

3.以键值对的形式进行存储。

4.存储时间为整体应用程序的存储时间,如果想需要删除,需要删除整体应用程序。

⚠️ 存储声明的时候因为是动态的,先声明再调用,声明存储的时候不会出现异常提示,但执行的时候会出现   --断言--(因为存储对象在这里编译是nil)

热点内容
什么id密码可以下载安卓 发布:2025-09-24 13:36:54 浏览:622
win7如何登陆ftp 发布:2025-09-24 13:01:29 浏览:172
海信电视怎么查看配置 发布:2025-09-24 13:00:31 浏览:783
android开发从零开始 发布:2025-09-24 12:51:28 浏览:113
为什么安卓不支持群折叠 发布:2025-09-24 12:03:53 浏览:227
开放上网如何设密码 发布:2025-09-24 11:31:08 浏览:566
编译原理语义分析实验报告 发布:2025-09-24 11:24:18 浏览:759
手机电脑文件夹同步 发布:2025-09-24 11:17:13 浏览:403
华为怎么关闭安卓系统 发布:2025-09-24 10:56:48 浏览:1013
其他配置是什么意思 发布:2025-09-24 10:52:52 浏览:55