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…

相關文章
相關標籤/搜索