iOS | 面试知识整理 - 数据持久化(八)

前言:

最近公司项目不怎么忙, 闲暇时间把iOS 在面试中可能会遇到的问题整理了一番, 一部分题目是本身面试遇到的,一部分题目则是网上收录的, 方便本身巩固复习, 也分享给你们! 知识点比较多,比较杂,这里作了分类,下面是分类连接地址;html

面试知识点整理 - 目录:面试

iOS | 面试知识整理 - OC基础 (一)
iOS | 面试知识整理 - OC基础 (二)
iOS | 面试知识整理 - OC基础 (三)
iOS | 面试知识整理 - UI 相 关 (四)
iOS | 面试知识整理 - 内存管理 (五)
iOS | 面试知识整理 - 多 线 程 (六)
iOS | 面试知识整理 - 网络相关 (七)
iOS | 面试知识整理 - 数据持久化 (八)
iOS | 面试知识整理 - Swift基础 (九)sql

iOS | 面试知识整理 - 数据持久化(八)


1. iOS中数据持久化方案有哪些?

  • NSUserDefault 简单数据快速读写
  • Property list (属性列表)文件存储
  • Archiver (归档)
  • SQLite 本地数据库
  • CoreData

2. 什么是序列化和反序列化,用来作什么

  • 序列化- 把对象转化为字节序列的过程
  • 反序列- 化把直接序列恢复成对象
  • 做用- 把对象写到文件或者数据库中,而且读取出来

3. OC中实现复杂对象的存储

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

4. SQLite 数据存储是怎么用?

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

5. CoreData是什么?

  • CoreData是iOS5以后才出现的一个框架,本质上是对SQLite的一个封装,它提供了对象-关系映射(ORM)的功能,即可以将OC对象转化成数据,保存在SQLite数据库文件中,也可以将保存在数据库中的数据还原成OC对象,经过CoreData管理应用程序的数据模型,能够极大程度减小须要编写的代码数量!

6. 简单描述下客户端的缓存机制?

  1. 缓存能够分为:内存数据缓存、数据库缓存、文件缓存
  2. 每次想获取数据的时候
  3. 先检测内存中有无缓存
  4. 再检测本地有无缓存(数据库\文件)
  5. 最终发送网络请求
  6. 将服务器返回的网络数据进行缓存(内存、数据库、文件), 以便下次读取

7. 什么是NSManagedObject模型?

NSManagedObjcet是NSObject的子类,Core Date的重要组成部分。是一个通用类,实现了Core Date模型层所需的基本功能,用户能够经过NSManagedObjcet创建本身的数据模型。数据库

8. 说一说你对SQLite的认识

  • SQLite是目前主流的嵌入式关系型数据库,其最主要的特色就是轻量级、跨平台,当前不少嵌入式操做系统都将其做为数据库首选。

9. 说一说你对FMDB的认识

  • FMDB是一个处理数据存储的第三方框架,框架是对sqlite的封装,整个框架很是轻量级但又不失灵活性,并且更加面向对象。
  • 咱们知道直接使用libsqlite3进行数据库操做实际上是线程不安全的,若是遇到多个线程同时操做一个表的时候可能会发生意想不到的结果。为了解决这个问题建议在多线程中使用FMDatabaseQueue对象,相比FMDatabase而言,它是线程安全的。
  • 将事务放到FMDB中去说并非由于只有FMDB才支持事务,而是由于FMDB将其封装成了几个方法来调用,不用本身写对应的sql而已。其实在在使用libsqlite3操做数据库时也是原生支持事务的(由于这里的事务是基于数据库的,FMDB仍是使用的SQLite数据库),只要在执行sql语句前加上“begin transaction;”执行完以后执行“commit transaction;”或者“rollback transaction;”进行提交或回滚便可。另外在Core Data中你们也能够发现,全部的增、删、改操做以后必须调用上下文的保存方法,其实自己就提供了事务的支持,只要不调用保存方法,以前全部的操做是不会提交的。在FMDB中FMDatabase有beginTransaction、commit、rollback三个方法进行开启事务、提交事务和回滚事务。

10. 什么是沙盒机制?

  • 每一个iOS程序都有一个独立的文件系统(存储空间),并且只能在对应的文件系统中进行操做,此区域被称为沙盒。应用必须待在本身的沙盒里,其余应用不能访问该沙盒。

11. 沙盒目录结构是怎样的?

沙盒结构json

  • Documents:经常使用目录,iCloud备份目录,存放数据,这里不能存缓存文件,不然上架不被经过
  • Library
    • Caches:存放体积大又不须要备份的数据,SDWebImage缓存路径就是这个
    • Preference:设置目录,iCloud会备份设置信息
  • tmp:存放临时文件,不会被备份,并且这个文件下的数据有可能随时被清除的可能

12. 使用 NSUserDefaults 时,如何处理布尔的默认值?(好比返回 NO,不知道是真的 NO 仍是没有设置过)

  • 若是使用 - (void)setBool:(BOOL)value forKey:(NSString *)defaultName;方法,来进行存储,就能够获取到正确的 bool 值
  • 若是使用 - (void)setObject:(nullable id)value forKey:(NSString *)defaultName;,须要在获取到值后在转为 bool类型

13. 代码题目分析,打印结果是什么?

NSUserDefaults *userdefault = [NSUserDefaults standardUserDefaults];
BOOL flag = NO;
[userdefault setObject:@(flag) forKey:@"flag"];

if ([userdefault objectForKey:@"flag"]) {
    BOOL eq = [userdefault objectForKey:@"flag"];
    if (eq) {
        NSLog(@"a");
    }else{
        NSLog(@"b");
    }
}else{
    BOOL eq = [userdefault objectForKey:@"flag"];
    if (eq) {
        NSLog(@"c");
    }else{
        NSLog(@"d");
    }
}
复制代码

打印结果 a
分析: 包装成 oc 对象,OC对象有值,转 bool 都是 yes浏览器

11. 若是后期须要增长数据库中的字段怎么实现,若是不使用CoreData呢?

  • 编写SQL语句来操做原来表中的字段
  • 增长表字段:ALTER TABLE 表名 ADD COLUMN 字段名 字段类型;
  • 删除表字段:ALTER TABLE 表名 DROP COLUMN 字段名;
  • 修改表字段:ALTER TABLE 表名 RENAME COLUMN 旧字段名 TO 新字段名;

14.FMDB使用 线程与事务

  1. FMDatabaseQueue 使用该类保证线程安全,串行队列
  2. 事物是一个并发控制的基本单元,所谓的事务,它是一个操做序列,这些操做要么都执行,要么都不执行,它是一个不可分割的工做单位。

15.xml 和 json 区别

  • XML的优势
    格式统一,符合标准; 容易与其余系统进行远程交互,数据共享比较方便。缓存

  • XML的缺点:
    XML文件庞大,文件格式复杂,传输占带宽;服务器端和客户端都须要花费大量代码来解析XML,致使服务器端和客户端代码变得异常复杂且不易维护;客户端不一样浏览器之间解析XML的方式不一致,须要重复编写不少代码;服务器端和客户端解析XML花费较多的资源和时间。安全

  • JSON的优势:
    数据格式比较简单,易于读写,格式都是压缩的,占用带宽小;易于解析,客户端JavaScript能够简单的经过eval()进行JSON数据的读取;支持多种语言,包括ActionScript, C, C#, ColdFusion, Java, JavaScript, Perl, PHP, Python, Ruby等服务器端语言,便于服务器端的解析;bash

  • JSON的缺点:
    没有XML格式这么推广的深刻人心和喜用普遍,没有XML那么通用性;JSON格式目前在Web Service中推广还属于初级阶段。服务器

17.什么是事务?

  • 做为单个逻辑工做单元执行的一系列操做,而这些逻辑工做单元须要具备原子性,一致性,隔离性和持久性
  • 是并发控制的基本单元。所谓的事务,它是一个操做序列,这些操做要么都执行,要么都不执行,它是一个不可分割的工做单元。例如,银行转帐工做:从一个帐号扣款并使另外一个帐号增款,这两个操做要么都执行,要么都不执行。因此,应该把它们当作一个事务。
  • 事务是一种机制,用于维护数据库的完整性

18. 熟悉经常使用SQL语句

create database name
drop database name
alter table name add column col type
select * from table1 where col=value
select count as totalcount from table1
select sum(field1) as sumvalue from table1
'insert into table1 (field1,field2) values(value1,value2) '
delete from table1 where something
update table1 set field1=value1 where field1 like ’%value1%' 复制代码

参考:www.cnblogs.com/acpe/p/4970…

19.当数据库中的某项数据未 null 时候,经过FMDB获取的数据为

[NSNull null]

下一篇入口:

iOS | 面试知识整理 - Swift基础 (九)

其实呢做为一个开发者,有一个学习的氛围跟一个交流圈子特别重要,这是个人微信 你们有兴趣能够添加 邀请小伙伴们进入QQ群里一块儿 交流(想要加群的能够直接扫码进群哦)


做者:LEON_iOS
连接:www.jianshu.com/p/c8a39b531…

相关文章
相关标签/搜索