20160816关于ios中的持久化

    xiaoxiao2026-04-11  3

    一.Plist 文件保存,这种方式数据安全性几乎为零。主要用于保存不用加密的数据,比如全国的省市城市等,数据保存在沙盒,所以沙盒需要了解一下

    首先需要了解一下Bundle和沙盒(sandbox)之间的区别:

    Bundle:应用程序在手机中的安装路径

    sandbox(沙盒):专门来存储当前APP自己的数据的路径

    Document:一般在该目录下保存一些比较重要的数据,比如:游戏相关的数据, 当连接iTunes后会自动同步数据

    Library(Library/Caches, Library/Preference):

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

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

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

    二.NSUserDefaults保存,通过NSUserDefaults类,你可以把用户首选项保存到plist文件中。NSUserDefaults把plist文件存储在沙盒中的library/Preferences目录下,这个plist文件一直存在,直到你删除应用程序。

    三.归档保存,归档是cocoa中的另一种对象序列化的技术,归档可以将复杂的对象写入文件,只要归档对象实现NSCopying协议。

    -(void)encodeWithCoder://编码

    使用: encodeObject:forKey

             encodeInt:forKey

    如果父类也支持NSCopying协议,则需要在函数的最后一行加上[super encodeWithCoder:encoder]

    -(void)initWithCoder://反编码

    使用: decodeObjectForKey

                decodeIntForykey 解码

    如果父类也支持NSCopying协议,需要这样写 if(self = [super initWithCoder:decoder]){...}

    四.NSKeyArchiver 和 NSKeyedUnarchiver

    NSKeyArchiver 和 NSKeyedUnarchiver 是NSCoder 的子类

    常用的函数

    [NSKeyArchiver archiveRootObject:dictionary toFile:path];

    NSDictionary *dictionary = [NSKeyedUnarchiver unarchiveObjectWithFile:path]

    五.Sqlite3

    SQlite是关系数据库管理系统,包含在一个轻量级的c语言中,是一个开源项目,支持多数的SQL-92标准,包括事物,即原子性、一致性、隔离性、持久性。

    对于数据的打开可以用SQLiter Manager,还有SQLiter Manager for  Mac版的

    用火狐浏览器的插件

    SQLiterManager的截图

    SQLiter原生的使用c语言库,编码比较麻烦,我们可以采取第三方库,对c函数进行了封装。PLDatabase,FMDB。

    我主要了解的是FMDB:

    在使用FMDB中无需考虑ARC和MRC,FMDB会自动适配,在FMDB的源码中发现这段宏

    #if ! __has_feature(objc_arc) #define FMDBAutorelease(__v) ([__v autorelease]); #define FMDBReturnAutoreleased FMDBAutorelease #define FMDBRetain(__v) ([__v retain]); #define FMDBReturnRetained FMDBRetain #define FMDBRelease(__v) ([__v release]); #define FMDBDispatchQueueRelease(__v) (dispatch_release(__v)); #else // -fobjc-arc #define FMDBAutorelease(__v) #define FMDBReturnAutoreleased(__v) (__v) #define FMDBRetain(__v) #define FMDBReturnRetained(__v) (__v) #define FMDBRelease(__v) // If OS_OBJECT_USE_OBJC=1, then the dispatch objects will be treated like ObjC objects // and will participate in ARC. // See the section on "Dispatch Queues and Automatic Reference Counting" in "Grand Central Dispatch (GCD) Reference" for details. #if OS_OBJECT_USE_OBJC #define FMDBDispatchQueueRelease(__v) #else #define FMDBDispatchQueueRelease(__v) (dispatch_release(__v)); #endif #endif #if !__has_feature(objc_instancetype) #define instancetype id #endif其中最主要的还是第一行代码,是否有ARC的特点。

    FMDB中三个重要的类:

    FMDatabase:是一个提供 SQLite 数据库的类,用于执行 SQL 语句。FMResultSet:用在 FMDatabase 中执行查询的结果的类。FMDatabaseQueue:在多线程下查询和更新数据库用到的类。 我在学习FMDB时主要参考了github上面一个开源项目

    https://github.com/Haley-Wong/JKDBModel

    作者封装了对数据库的基本操作,有两个类JKDBHelper和JKDBModel,大家有兴趣可以看看。

    六.Core Data

    关于Core Data 我在20160811关于CoreData的简单使用 有所介绍。

    本文 

          完。

    转载请注明原文地址: https://ju.6miu.com/read-1308730.html
    最新回复(0)