不得不说,这个系列的视频录制的一点都不友善,我尝试看了好多次,也没有看明白,模模糊糊的感觉一点也不好。不知道是老师的问题还是课程设置的问题。总是不知所以然的状态,我看到这里的时候都差点要放弃学习iOS开发了,还好,放弃一个周之后又重新拾起来了。不过我用其他学校的数据存储视频代替了麦子学院数据存储视频了。没办法,麦子学院的数据存储有点不适合我。。

图片 1

Title: iOS数据持久化

在IOS中,数据存储的方式有以下七个方法:

人生若只如初见.jpg

##数据持久化概念

1.NSUerDefaults

将数据保存到本地是程序猿经常碰到的问题,目的是能够让程序运行的更加流畅,不会频繁的出现菊花,使用户体验更好,iOS有以下四种数据存储方式

数据持久化就是将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中的数据模型的统称。

  1. Setting Bundle

1、归档(NSKeyedArchiver):该数据需要遵守NSCoding协议,并且该对象对应的类必须提供两个方法:encodeWithCorder(此方法告诉系统怎么对对象进行编码) 和 initWithCoder(此方法告诉系统怎么对对象进行解码)

  • 需要实现NSCoding协议

    ///    待归档的数据
    var name : String!
    var code : String!
    
    /**
       以keyValue的形式对基本数据类型encode和Decoding

\*/

func encodeWithCoder(aCoder: NSCoder) {  
aCoder.encodeObject(name,forKey: "name")  
aCoder.encodeObject(phone,forKey: "phone")  
}

required init?(coder aDecoder: NSCoder) {

      super.init()
      name = aDecoder.decodeObjectForKey("name") as? String
      phone = aDecoder.decodeObjectForKey("phone") as? String

}

  • 缺点:归档只能一次性归档保存或者一次性解压,所以只能针对小量数据,而且对数据的操作比较笨拙,即如果想改动一小部分数据,还是需要解压或者归档整个数据才能操作

##数据持久化的好处

3.通用文件存储

2、NSUserDefaults:用来保存应用程序设置、属性和用户保存的数据,用户再次打开程序或者开机后数据仍然存在

  • 存储到NSUserDefaults
    func saveToUserDefaults() {
    let userDefaults = NSUserDefaults.standardUserDefaults()
    /**
    存储数据
    /
    userDefaults.setObject(“今宵酒醒何处”, forKey: “love”)
    userDefaults.setObject(“杨柳岸”, forKey: “you”)
    userDefaults.setObject(“晓风残月”, forKey: “299”)
    /
    *
    同步数据
    */
    userDefaults.synchronize()
    }

  • 从NSUserDefaults中读取
    func readFromUserDefaults(){
    let user = NSUserDefaults.standardUserDefaults()
    let love = user.valueForKey(“love”)
    let you = user.valueForKey(“299”)
    print(love!)
    print(you!)
    }

1.
程序代码重用性强,即使更换数据库,只需要更改配置文件,不必重写程序代码。

4.对象归档

3、存储为plist属性列表:永久保存在磁盘中

  • NSSearchPathDirectory.DocumentDirectory查找Documents文件夹

  • NSSearchPathDomainMask.UserDomainMask在用户的应用程序下查找

  • true 展开路径

  • filePath:
    /Users/hs015/Library/Developer/CoreSimulator/Devices/F7C2C547-79DC-459E-991E-342F2125F87E/data/Containers/Data/Application/C96CC0D6-8285-4EA4-B97A-4BC020694F8D/Documents/mix.plist
    ** 1、写入文件中**

     fun writeToFile{
       let path = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)[0] as NSString
       let filePath = path.stringByAppendingPathComponent("mix.plist")
       print(filePath)
    
       /// 存储为数组类型
       let dataSourse = NSMutableArray()
       dataSourse.addObject("人生若只如初见")
       dataSourse.addObject("何事秋风悲画扇")
       dataSourse.writeToFile(filePath, atomically: true)
    
       /// 存储为字典类型
       let dataDic = NSMutableDictionary()
       dataDic.setValue("mix", forKey: "name")
       dataDic.setValue("18", forKey: "age")
       dataDic.setValue("程序猿", forKey: "job")
       dataDic.writeToFile(filePath, atomically: true)
     }
    

** 2、从文件中读取**

    func readFromFile() {
        /// 获得沙盒的根路径
        let home = NSHomeDirectory() as NSString
        /// 获得Documents路径
        let docPath = home.stringByAppendingPathComponent("Documents") as NSString
        /// 获得已创建的plist文件的路径
        let file = docPath.stringByAppendingPathComponent("mix.plist")
        /// 读取数据
        let dataA = NSDictionary(contentsOfFile: file)
        let data = NSArray(contentsOfFile: file)
        print(dataA!)
        print(data!)
    }
  1. 业务逻辑代码可读性强,在代码中不会有大量的SQL语言,提高程序的可读性。

  2. 持久化技术可以自动优化,以减少对数据库的访问量,提高程序运行效率。

5.SQLite

4、数据库:主要存储一些比较大的数据

有SQLite、Core
Data、第三方类库等,比前三种复杂一丢丢,这里就不做介绍了,改天抽时间再整理一下

小菜鸟一个,有问题欢迎讨论指教,
一方面让我张张见识,另一方面我也不想误人子弟啊啊啊啊

##iOS数据持久化方案

6.Core Data

– NSUserDefault

7.iCloud

– 文件存储 (包括:Plist属性列表、archive 归档、文件流)

数据存储的基本操作,也就说不管你使用什么方法,这个方法都需要能满足下面这5个基本操作:

– 钥匙串(keychain)

1.保存

– 数据库相关 (Core Data、SQLite 3)

2.更新

###沙盒机制

3.删除

在iOS中每个APP都拥有自己的**沙盒**,APP**只能访问**对应沙盒中存储的数据,
iOS是**不允许**跨越沙盒去访问数据的,所有的数据都是保存在该沙盒的三个子目录下。

4.加载

###沙盒目录结构

5.查询

“`

1.了解应用程序沙盒。

开始学习数据存储方式之前,先需要了解应用程序沙盒。

因为IOS对数据存储有一定的要求,而且会进行权限检测,APP只能在应用程序沙盒中读取文件,这要求我们在编程时,需要的文件都要保存在沙盒内部。

应用程序.ipa

2.应用程序沙盒里有四个文件:

1)MyApp.app: 存放App Bundle和APP的可执行代码。

2)Documents:存放重要的用户文档和应用数据文件。注意:A-1
NSUerDefaults中的首选项数据不在其中

3)Library:存放系统文件。

4)tmp:临时的数据。不要存放重要的文件。

Documents

3.学习通过iphone模拟器的目录来了解APP的C-2应用程序沙盒的四个目录。

Library

4.学习通过代码来获取文件目录。

1)C语言的方法

var path = NSSearchPathForDirectoriesInDomains (
NSSearchPathDirectory.DocumentDirectory,
NSSearchPathDomainMask.UserDomainMask, true )
//注意:这里最后写true表示显示完整路径,false只显示最后一个文件夹的名字

var documentsDirectory =path[0] as String
//注意:path[0]零表示的是D-2-2) 中的Documents

printlin(documentsDirectory)

2)专门给IOS准备的方法

var fileManager = NSFileManager.defaultManager()

var documentDirectorWithManager =
fileManager.URLsForDirectory(NSSearchPathDirectory.DocumentDirectory,
inDomains: NSSearchPathDomainMask.UserDomainMask)

println(documentDirectorWithManager)

数据存储的第一种方法,即A-1。NSUserDefaults往往用在设置中(当然,还需要和A-2组合使用才能实现),当我们开发的APP需要开发系统设置这个功能时,可以采用这种存储方式。

是单例,整个程序中只有一个实例对象。

适合存储轻量级的数据。

可以存储的类型有限:

NSData

NSString

NSNumber(Int,Double,Float)

NSDate

NSDictionary(Dictionary)

Bool

也是因为这些特性,决定了NSUserDefaults的使用场景。

关键命令:

var userDefaults = NSUserDefaults.standardUserDefaults()

var text = dataInputTextField.text

userDefaults.setObject(text, forKey: “text1”)
数据存入格式set多种可选择的格式。set作为前缀

userDefaults.synchronize() 存入数据生效

var textget = userDefaults.stringForKey
读取以前存入的数据,可选择多种格式。ForKey作为后缀。

数据存储的第二种方法,即A-2。往往和A-1组合使用,完成APP的设置界面的功能开发。一般setting
bundle和NSUserDefaults结合起来使用,才能完成设置这个功能的开发。这个设置是iPhone的设置按钮,不是APP内部的那个设置。

通用文件存储可以用来存储序列化对象(serialized
object)。序列化对象(serialized
object)是指可以倍转换为字节以便于存储到文件中或者通过网络进行传输的对象。不过目前只能将某些对象放置到某些集合类中然后存储到通用文件中去,不是所有的对象都可以存储到通用文件当中去的。

可以进行对象序列化的类有:

· NSData

· NSString

· NSNumber(Int, Double,Float)

· NSDate

· NSArray

· NSDictionary(Dictionary)

对象归档:将对象转换成可以写入到文件中的格式,通常是以一种不可读的方式进行保存。

对象反归档(Unarchive):将数据从文件中读出并自动重建对象。

1.需要继承NSObject、NSCoding。同时需要写一下代码:

图片 2对象归档图片 3对象归档后的读取

苹果公司提供的关系型数据库。

Entities实体。命名的时候首字母要大写,首字母之前不能有符合数字。

Attributes 属性

Relationships 关系:一对一 to one,一对多to many,多对一,多对多

Fetched Properties 提取属性

control拖拽可以建立关系

\Caches

对此专题视频课程设置的疑问:

1.为什么要学习这两个个代码?有什么作用吗?在什么情况下会使用这个方法?如果告知原因,对理解掌握这个方法更有帮助的。

2.如果这两个代码的作用是通过代码来找到Documents文件夹,那么这个文件夹是应用程序沙盒中的Documents文件夹吗?

那应用程序沙盒中其他的三个文件夹(MyApp.app;Library,tmp)如何获取呢?为什么不讲呢?是因为不重要吗?

3.我尝试着把var documentsDirectory =path[0] as String
中的数字零改成其他数字,但是都说是超出数组范围了,那么这个数组只有零一个下标吗?

\Preferences

Temp

“`

– `应用程序包`:
这里存放的是应用程序的源文件,包括资源文件和可执行文件。

“`

NSString *ApplicationPath = [[NSBundle mainBundle] bundlePath];

“`

– `Document`: 一般在该目录下保存一些比较重要的数据,当连接
iTunes后会自动同步数据。

“`

NSString *DocumentPath = [NSSearchPathForDirectoriesInDomains
(NSDocumentDirectory, NSUserDomainMask, YES).firstObject];

“`

`PS: 
如果将数据资源保存到该目录.上架可能会被拒绝,(解决方案:直接设置该文件夹不被iTunes备份),总之:不能保存从网上下载的数据,否则不能上架。`

– `Library`: 存储应用设置或者状态信息等,在该目录下还有两个子目录:
`Caches和Preference`

“`

NSString *CachesPath = 
[NSSearchPathForDirectoriesInDomains(NSCachesDirectory,
NSUserDomainMask, YES).firstObject];

“`

`Library/Caches`:
存放缓存文件,iTunes不会备份,因此文件不会因APP退出而删除(一般使用SDWebImage的缓存资源都是保存到这来)

`Library/Preference`:
保存应用的所有偏好设置,iOS的Setting(设置)会在该目录查找该应用的设置信息,iTunes会同步数据

– temp: 临时文件, iTunes不会备份该文件夹中的数据,
这个文件夹中的数据,会因为应用的关闭而删除。

“`

NSString *tempPath = NSTemporaryDirectory( );

“`

###NSUerDefault

小规模数据,弱业务相关数据,都可以放到`NSUserDefault`里面。


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


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


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

Author

发表评论

电子邮件地址不会被公开。 必填项已用*标注