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, 申请不到锁直接返回.