iOS数据存储

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u014799068/article/details/51201427

1、沙盒机制&应用程序目录

默认情况下,每个沙盒含有3个文件夹:Documents,Library和tmp.由于受沙盒机制的限制,应用只能在这几个目录下读写文件;在iTunes与iPhone同步时,会备份所有的Dcuments和Library目录,并且当iPhone在重启时,会丢弃所有的tmp文件。
Documents:苹果建议将程序中的文件数据保存在该目录下,并且在iTunes备份和恢复的时候也会包含此目录。
Library: 用户存储程序的默认设置或其他状态信息
Library/Caches: 存放缓存文件,iTunes不会备份此目录,此目录下文件不会在应用退出时删除。
Library/Preferences: 存储程序的默认设置,基于NSUserDefaults的首选项设置便存储在这里。
tmp: 用于供应用程序存储临时文件,并且iTunes不会备份tmp中的文件。

//获取沙盒home目录
var path = NSHomeDirectory()
print("Home=\(path)")
//获取Doucments目录
 path =NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first!
print("Documents =\(path)")
 //获取Library目录
path = NSSearchPathForDirectoriesInDomains(.LibraryDirectory, .UserDomainMask, true).first!
print("Library =\(path)")       
//获取Caches目录
path = NSSearchPathForDirectoriesInDomains(.CachesDirectory, .UserDomainMask, true).first!
print("caches = \(path)")
//获取tmp目录
path = NSTemporaryDirectory()
print("tmp=\(path)")

2、目录文件管理

//检测目录是否存在
    func checkDirectoryPath(path: String) -> Bool {
       let mainPath = NSFileManager.defaultManager()
        let result = mainPath.fileExistsAtPath(path)
        if result {
             print("DirectoryPath。。。")
        } else {
            print("No DirectoryPath。。。")
        }
        return result
    }
    //创建目录
    func createDirectoryPath(path: String){
        let mainPath = NSFileManager.defaultManager()
        do{
         try mainPath.createDirectoryAtPath(path, withIntermediateDirectories: false, attributes: nil)
        }catch {
            print("create  directoryPath failured")
        }
    }
    //删除目录
    func deleteDirectoryPath(path: String) {
        let mainPath = NSFileManager.defaultManager()
        do{
            try mainPath.removeItemAtPath(path)
        }catch{
            print("remove failured..")
        }
    }

3、用户首选项

用户首选项又被称为偏好设置,它被设计用来存储设备和应用的配置信息,通过NSUserDefaults类来实现。通常情况下,我们首先通过一个类方法返回默认的、也是最常用到的实例对象,这个对象中储存了系统中用户的配置信息,然后开发者就可以童工这个是咧对象对这些已有的信息进行修改,也可以按照自己的需求创建新的配置项。
NSUserDefaults把配置信息以字典的形式组织起来,支持字典的项包括: 字符串、数组,数字等基本格式。

  //用户首选项存储信息
  let userSingle = NSUserDefaults.standardUserDefaults()
  userSingle.setObject(NSDate(), forKey: "currentTime")
  userSingle.synchronize()
  //获取信息
  let currentTime = userSingle.objectForKey("currentTime")
  print("print\(currentTime)")

4、属性列表

在iOS中有一类名为属性列表的对象,通常简写为plist.这些列表用来放置一些iOS能够处理的对象,这些属性列表类是NSArray、NSDictionary、NSString NSNumber NSDate NSData,以及它们的可修改状态。

 //属性列表
	let documentsPath: String = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first!
        let namePath = "\(documentsPath)/name.plist"
        let nameDic: NSDictionary = ["name":"zhangkuo","age":"27"]
        //写入文件
        nameDic.writeToFile(namePath, atomically: true)
        //获取文件内容
        let nameDicPath = NSDictionary(contentsOfFile: namePath)!
        print("nameDicPath =\(nameDicPath)")

5、编码对象

我们不能总是将对象信息表示为属性列表类,对于我们创建的自定义的类,iOS具备一种将对象转换成某种格式并保存到沙盒的机制。对象可以实现NSCoding协议,将它们的实例变量和其他数据编码为数据块,然后保存到沙盒中,这些数据块以后还可以读取到内存中,并且还能基于保存的数据创建新对象,这个过程称为编码与解码,也可以叫做序列化与反序列,并且我们保存对象的过程被称为归档,从文件恢复对象的过程被称为解档。(NSKeyedArchiver操作)。
6、SQLite简介

SQLite是一款轻型的嵌入式数据库,安卓和iOS开发使用的都是SQLite数据库。它占用资源非常的低,在嵌入式设备中,可能只需要几百k的内存就够了,并且它的处理速度比MySQL数据库都要快。
7、SQLite数据基本操作

//sqlite3数据库操作
        var db: COpaquePointer = nil //创建C指针
        let path = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first!
        let sqliteFile:NSString = "\(path)/test.sqlite3"
        let sql  = sqliteFile.UTF8String
        //打开或创建数据库
        if sqlite3_open(sql, &db) != SQLITE_OK {
            print("create sql failured")
            sqlite3_close(db)
        }
        //创建表
        let string: NSString = "create table if not exists Student(id integer primary key autoincrement, son text, name text, score integer)"
        let sqlString = string.UTF8String
       if sqlite3_exec(db, sqlString, nil, nil, nil) != SQLITE_OK {
            print("创建失败")
            sqlite3_close(db)
        }

8、CoreData简介

Core Data是苹果公司推出的一种数据持久化解决方案,其原理是对SQLite的封装,我们不需要接触SQL语句,就可以对数据库进行操作。
通过Core Data,我们可以将程序中的对象存储为外部数据,当然也可以将外部数据恢复为程序中的对象,其实这些工作是由Core Data的一系列的类来协作完成的,我们把这些类的集合称为持久存储栈,它是由以下部分组成:
1)、托管对象模型: Managed object model
它可以被理解为数据库模型,表示程序中数据模型的每一对象类型,对象包含的属性以及对象之间关系。Core Data栈使用这个模型来创建对象,存储属性以及保存数据。
2)、持久化存储:Persistent store
它用于读取和存储数据到某种指定类型的存储仓库中。Core Data提供了4种类型的存储仓库,其中3种是原子的,一种是非原子的。这里的原子和原子操作意义不同。这里的原子仓库指的是当你要读或写数据时,必须将整个仓库反序列化并加载到内存中。而非原子仓库则可以指加载一部分数据到内存中即可操作。
仓库的类型有4种:

  1. NSQLiteStoreType: 后台为SQLite数据库,非原子仓库。轻量化并且占用较少内存,推荐在iOS程序中使用这种仓库。Xcode core data模板默认使用这种仓库。
    
  2. NSXMLStoreType: 后台为XML文件,原子仓库。人可读的数据仓库类型,但是占用大量内存,只有OSX可以使用这种类型。
  3. NSBinaryStoreType: 后台为二进制文件,原子仓库,仍然占用大量内存,不推荐。
  4. NSInMemoryStoreType: 内存仓库类型,原子仓库,非“持久”化,结束程序或者关机都会导致数据丢失。
    3)、持久化存储助理:Persistent store coordinator
    它是托管对象模型和持久化存储之间的桥梁。它完成了Core Data中最负责的部分,这个类NSManagedObjectModel,它知道如何发送消息给NSPersistentStore,也知道如何从NSPersistentStore获取数据。助理的存在隔离和隐藏了Persistent store的具体实现和配置方法,因为NSManagedObjectContext不需要了解数据到底是存储到SQLite仓库中,还是存储在其他类型的仓库中。如果程序使用了多个Persistent store,助理用于向Managed context提供一个统一的接口。
    4)、托管对象上下文:Managed object context
  5. Managed object context 是一个内存中的对象,用于和Managed object协同工作,通常情况下,我们接触和使用最多的就是NSMagagedObject

9、构建持久存储栈

10、CoreData数据基本操作

未完待续

猜你喜欢

转载自blog.csdn.net/u014799068/article/details/51201427
今日推荐