本地储存

sqlite 中插入字符和接收到的处理方法

除了'其他都是在特殊符号前面加/, keyWord = keyWord.replace("/","//");

什么是NSManagedObject模型

NSManagedObject 是 NSObject 的子类, 也是 core data 里面很重要的组成部分. 是一个通用类, 实现了 Core Date 模型层所需的基本功能, 用户可以通过 NSManagedObject 建立自己的数据模型.

实现过多线程的 Core Data

  • core data 中的 NSManagedObjectContext 在多线程中不安全
  • 如果想要多线程访问 coreData 的话, 最好的方法是一个线程一个 NSManagedObjectContext
  • 每一个 NSManagedObjectContext 对象实例都可以使用同一个 NSPersistentStoreCoordinator 实例, 这是因为 NSManagedObjectContext 会在使用 NSPersistentStoreCoordinator 前上锁.

NSPersistentStoreCoordinator, NSManagedObjectContext 和 NSManagedObject 中的哪些需要在线程中创建或者传递

coreDate

  • CoreData 是对 SQLite 数据库的封装
  • CoreData 中有三个对象是必须掌握的
  • NSManagedObject: 只要定义一个类继承与该类就会创建一张与之对应的表, 也就是一个集成该类的类对应一张表, 每一个通过集成该类创建出来的对应, 都是该类对应的一条数据
  • NSManagedObjectContext: 用于操作数据库, 只要有类它就能对数据库的表进行操作增删改查.
  • NSPersistentStoreCoordinator: 决定数据存储的位置 (SQLite / XML / 其他数据里)

客户端缓存机制的描述

分类:

  • 内存数据缓存
  • 数据缓存
  • 文件缓存
    过程:
  • 每次想要获取数据的时候
  • 先检测内存中有没有缓存
  • 在检测本地有没有缓存 (数据库/文件)
  • 最终发送网络请求
  • 将服务器返回的网络数据进行缓存 (内存, 数据库, 文件), 方便下次读取.

序列化和反序列化

  • 序列化把对象转换成字节序列过程
  • 反序列化把序列恢复成对象
    作用: 把对象写到文件或者数据库中, 并且读出来.

OC中实现复杂对象的储存

  • 遵循 NSCoding 协议, 实现复杂对象的存储, 实现该协议后可以对其进行打包或者解包, 转化为 NSDate

iOS 中常用的数据储存方式

  • NSUserDefault: 一般储存偏好设置
  • KeyChain: 提供了一种安全的保存私密信息(密码,序列号,证书等)的方式。每个ios程序都有一个独立的keychain存储。我就是上传了一个UDID 给后台
  • File: plist, Archiver, Stream 三种方式进行存档
  • DB: 包括 core Data 和 FMDB.

SQLite 分析

理解:

  • SQLite 是目前主流的嵌入式关系型数据库, 特点是轻量级, 跨平台, 当前很多嵌入式操作系统都将其作为数据库首选
  • SQLite 是一款轻型数据库, 但是功能不亚于很多大型关系数据库.

特点:

  • 基于 C 语言开发的轻型数据库
  • 在 iOS 中需要是用 C 语言语法进行数据库操作, 访问. (不能使用 Objc 进行访问, 因为 SQLite 是基于 C 语言写的)
  • SQLite 中采取的是动态数据存储, 一开始定义了一种类型, 以后的实际操作也可以存储其他类型. 但是推荐一开始创建适合的类型. (特别需要考虑应用跨平台)
  • 建立连接之后通常不需要关闭连接 (也可以手动关闭)

过程:

  • 打开数据库, 利用 sqlite3_open() 打开数据库会指定一个保存文件保存路径, 如果文件存在直接打开, 不存在创建打开. 打开数据库可以得到一个 sqlite3 类型对象, 后面需要借助这个对象进行其他操作.
  • 执行 SQL 语句, 执行 SQL 语句有包括返回值和没有返回值的语句.
  • 对于没有返回值的语句 (增删改等) 直接通过 sqlite3_exec() 函数执行
  • 对于有返回值的语句, 首先通过 sqlite_prepare_v2() 进行 sql 语句评估 (语法检测), 然后通过 sqlite3_step() 一次取出查询结果的每一行数据, 对于每行数据都可以通过对应的 sqlite3_column 类型 () 方法活得对应列的数据, 如此返回循环知道便利完成. 最后释放句柄.

FMDB 分析

理解:

  • FMDB 是一个处理数据储存的第三方框架, 框架是对 sqlite 的封装, 整个框架非常轻量级但又不失灵活, 而且更加面向对象.

特点:

  • FMDB 基于 lib sqlite3 框架的封装, 使用方法类似, 使用前打开一个数据库, 这个数据库文件存在则直接打开否则创建打开.这里 FMDB 引入一个 MFDatabase 对象来标示数据库, 打开数据库操作全部依赖这个对象.
  • 在 FMDB 中提供了俩个方法, 有参数对应的是executeQuery, 无参数的是executeUpdate. 注意点: 如果调用格式化参数的 sql 语句的时候, 格式化符号使用的是 "?" 而不是 "%@".
  • 直接使用 lib sqlite3 进行数据操作线程是不安全的, 不同线程同事操作一个表就会发生意想不到的效果. 多线程中使用 FMDatabaseQueue 对象, 相比 FMDatabase 而言, 他的线程是安全的.
    注意: 经常反问自己, 经常用什么数据储存, 问什么选择它? 什么是序列化? Sqlite 是直接用它还是封装了它的第三方库? sqlite 和 core data 有什么区别?

iOS 平台怎么做数据的持久化, coredata 和sqlite 有误必然的联系; coredata 是一个关系型数据库吗

  • iOS 可以有始终持久化数据的方式: 属性列表, 对象归档, SQLite3 和 Core Data
  • coredata 可以使你以图形界面的方式快速定义 app 的数据模型, 同时在你的代码中容易获取到它.
  • coredata 可以使你以图形界面的方式快速的定义 app 的数据模型, 同时在你的代码中容易获取到它.
  • coredata 提供了基础结构去处理常用的功能, 例如保存,恢复,撤销和重做, 允许你在 app 中继续创建新的任务.
  • 在使用 coredata 的时候, 你不用安装额外的数据库系统, 因为 coredata 使用内置的 aqlite 数据库.
  • coredata将你 app 的模型层放入到一组定义在内存中的数据对象.
  • coredata 会最终这些对象的改变, 同时可以根据需要做相应的改变, 例如用户自行撤销命令.
  • 当 coredata 在对你 app 数据的改变进行保存的时候, coreData 会把这些数据归档, 并且永久保存
  • mac os x 中的 sqlite 库, 它是一个轻量级功能强大的关系数据引擎, 也很容易嵌入到应用程序. 可以在多个平台使用, sqlite 是一个轻量级的嵌入式sql数据库编程.
  • 与 coreData 框架不同的是, sqlite 是使用程序式的sql的主要的 API 来直接操作数据表.
  • Core Data 不是一个关系型数据库, 也不是关心新数据库管理系统.
  • 虽然 Core Data 支持 SQLIte 作为一种储存类型, 但它不能使用任意的 SQLite 数据库.
  • Core Data 在使用的过程中穿甲你这个数据库. core Data支持对一, 对多的关系.

修改数据库中的字段

  • 增加表字段: ALTER TABLE 表名 ADD COLUMN 字段名 字段
  • 删除表字段: ALTER TABLE 表明 DROP COLUMN 字段名:
  • 修改表字段: ALTER TABLE 表名 RENAME COLUMN 旧字段名 TO 新字段名

SQLite 数据存储是怎么用的

  • 添加 SQLite 动态库: 导入头文件: #import <sqlite3.h>
  • 利用 C 语言函数创建/打开数据库, 编写 SQL 语句

iOS 沙盒目录结构是怎样的, App Bundle 里面有什么

沙盒结构:

  • Application: 存放程序源文件, 上架前经过数字签名, 上架后不可修改
  • Documents: 常用目录, iCloud 备份目录, 存放数据, 这里不能缓存文件, 否则上架不能通过
  • Library:
    • Caches: 存放体积大又不需要备份的数据, SDWebImage 缓存路径就是这个
    • Preference: 设置目录, iCloud 会备份设置信息.
    • tmp: 存放临时文件, 不会被被备份, 而且这个文件下的数据有可能随时被清除的可能.

App Bundle 里面有什么

  • Info.plist: 此文件包含了应用程序的配置信息, 系统以来此文件以获取应用程序的相关信息.
  • 可执行文件: 这个文件包含应用程序的入口和通过静态连接到应用程序 target 的代码
  • 资源文件: 图片, 声音文件一类的
  • 其他: 可以嵌入定制的数据资源

如何储存用户的一些敏感信息, 如登录的 token

  • 使用 keychain 储存, 也就是钥匙串, 使用 keychain 需要导入 security 框架
    使用 NSUserDefaults 时, 如何处理布尔的默认值? (比如返回 NO, 不知道是真的 NO 还是没有设置过)
if([[NSUserDefaults standardUserDefaults] objectForKey:ID] == nil) {
 NSLog(@"没有设置􁀌􀹍􁦡􁗝"); 
}

MD5 和 Base64 的区别是什么, 各自使用场景是什么

做过加密相关的功能, 几乎都会使用到 MD5 和 Base 64, 他们俩着在实际开发中是最常用的

  • MD5: 是一种不可逆的摘要算法, 用于生成摘要, 无法逆着破解得到原文. 常用的是生成32位照耀, 用于验证数据的有效性. 比如, 在网络请求接口中, 通过将所有的参数生成摘要, 客户端和服务端采用同样的规则生成摘要, 这样可以防篡改. 又如, 下载文件的时候, 通过生成文件的摘要, 用于验证文件是后损坏.
  • base64: 属于加密算法, 是可逆, 经过 encode 后, 可以 decode 得到原文. 在开发中, 有的公司上传图片采用的是将图片转换成 base 64 字符串, 在上传. 在做加密相关的功能时, 通常会将数据进行base 64 加密/ 解密.

plist文件用来做什么的. 一般用它来处理一些什么方面的问题.

  • plist 是 iOS 系统中特有的文件格式. 我们常用的 NSUserDefaults 编号设置实质上就是 plist 文件长做. plist 文件是用持久化储存数据的.
  • 通常我们使用它来储存编号设置, 以及那些少量的, 数据结构比较复杂的不适合储存数据库的数据. 比如, 我们要存储全国的城市名称和id, 那么我们要优先选择 plist 直接持久化存储, 因为更简单.

当存储大块数据怎么做

  • NSUserDefault: 虽然它很 nice 也很便捷, 但是它只适用于小数据, 比如一些简单的布尔型的设置选项, 在大点你就得考虑其他方式了
  • XML结构化归档: 你需要读取整个文件到内存里面去解析, 这样是很不经济.
  • NSCoding: 也存在读写文件问题,
  • SQLite或者CoreData: 这种情况下推荐使用这俩个

怎么解决sqlite锁定的问题

  • 设置数据库锁定的处理函数
int sqlite3_busy_handler(sqlite3*, int(*)(void*,int), void*);

函数可以定义一个函数回调, 当出现数据库忙时, sqlite 会调用改函数, 当回调法术为 NULL 时, 清除 busy handle, 申请不到锁直接返回, 回调函数的第二个函数会被传递为此次忙时间调用该函数的次数, 回掉函数返回非 0, 数据库会重试当前操作, 返回0折当前操作返回 SQLITE_BUSY

  • 设定锁定时的等待时间
int sqlite3_busy_timeout(sqlite3*, 60);

定义一个毫秒数, 当未达到该毫秒数时, dqlite 会 sleep 并从事当前操作, 如果超过ms毫秒, 仍然申请不到需要的锁, 当前操作返回 sqlite_BUSY 当 ms <= 0 时, 清除 busy handle, 申请不到锁直接返回.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容