iOS | 面試- 數(shù)據(jù)持久化

iOS | 面試知識(shí)整理 - 數(shù)據(jù)持久化(八)

1. iOS中數(shù)據(jù)持久化方案有哪些?

NSUserDefault簡單數(shù)據(jù)快速讀寫

Property list(屬性列表)文件存儲(chǔ)

Archiver(歸檔)

SQLite本地?cái)?shù)據(jù)庫

CoreData

2. 什么是序列化和反序列化,用來做什么

序列化- 把對(duì)象轉(zhuǎn)化為字節(jié)序列的過程

反序列- 化把直接序列恢復(fù)成對(duì)象

作用- 把對(duì)象寫到文件或者數(shù)據(jù)庫中,并且讀取出來

3. OC中實(shí)現(xiàn)復(fù)雜對(duì)象的存儲(chǔ)

遵循NSCoding協(xié)議,實(shí)現(xiàn)復(fù)雜對(duì)象的存儲(chǔ),實(shí)現(xiàn)該協(xié)議后可以對(duì)其進(jìn)行打包或者解包,轉(zhuǎn)化為NSDate

4. SQLite 數(shù)據(jù)存儲(chǔ)是怎么用?

添加SQLite動(dòng)態(tài)庫:

導(dǎo)入主頭文件:#import <sqlite3.h>

利用C語言函數(shù)創(chuàng)建\打開數(shù)據(jù)庫,編寫SQL語句

5. CoreData是什么?

CoreData是iOS5之后才出現(xiàn)的一個(gè)框架,本質(zhì)上是對(duì)SQLite的一個(gè)封裝,它提供了對(duì)象-關(guān)系映射(ORM)的功能,即能夠?qū)C對(duì)象轉(zhuǎn)化成數(shù)據(jù),保存在SQLite數(shù)據(jù)庫文件中,也能夠?qū)⒈4嬖跀?shù)據(jù)庫中的數(shù)據(jù)還原成OC對(duì)象,通過CoreData管理應(yīng)用程序的數(shù)據(jù)模型,可以極大程度減少需要編寫的代碼數(shù)量!

6.? 簡單描述下客戶端的緩存機(jī)制?

緩存可以分為:內(nèi)存數(shù)據(jù)緩存、數(shù)據(jù)庫緩存、文件緩存

每次想獲取數(shù)據(jù)的時(shí)候

先檢測內(nèi)存中有無緩存

再檢測本地有無緩存(數(shù)據(jù)庫\文件)

最終發(fā)送網(wǎng)絡(luò)請(qǐng)求

將服務(wù)器返回的網(wǎng)絡(luò)數(shù)據(jù)進(jìn)行緩存(內(nèi)存、數(shù)據(jù)庫、文件), 以便下次讀取

7. 什么是NSManagedObject模型?

NSManagedObjcet是NSObject的子類,Core Date的重要組成部分。是一個(gè)通用類,實(shí)現(xiàn)了Core Date模型層所需的基本功能,用戶可以通過NSManagedObjcet建立自己的數(shù)據(jù)模型。

8. 說一說你對(duì)SQLite的認(rèn)識(shí)

SQLite是目前主流的嵌入式關(guān)系型數(shù)據(jù)庫,其最主要的特點(diǎn)就是輕量級(jí)、跨平臺(tái),當(dāng)前很多嵌入式操作系統(tǒng)都將其作為數(shù)據(jù)庫首選。

9. 說一說你對(duì)FMDB的認(rèn)識(shí)

FMDB是一個(gè)處理數(shù)據(jù)存儲(chǔ)的第三方框架,框架是對(duì)sqlite的封裝,整個(gè)框架非常輕量級(jí)但又不失靈活性,而且更加面向?qū)ο蟆?/p>

我們知道直接使用libsqlite3進(jìn)行數(shù)據(jù)庫操作其實(shí)是線程不安全的,如果遇到多個(gè)線程同時(shí)操作一個(gè)表的時(shí)候可能會(huì)發(fā)生意想不到的結(jié)果。為了解決這個(gè)問題建議在多線程中使用FMDatabaseQueue對(duì)象,相比FMDatabase而言,它是線程安全的。

將事務(wù)放到FMDB中去說并不是因?yàn)橹挥蠪MDB才支持事務(wù),而是因?yàn)镕MDB將其封裝成了幾個(gè)方法來調(diào)用,不用自己寫對(duì)應(yīng)的sql而已。其實(shí)在在使用libsqlite3操作數(shù)據(jù)庫時(shí)也是原生支持事務(wù)的(因?yàn)檫@里的事務(wù)是基于數(shù)據(jù)庫的,F(xiàn)MDB還是使用的SQLite數(shù)據(jù)庫),只要在執(zhí)行sql語句前加上“begin transaction;”執(zhí)行完之后執(zhí)行“commit transaction;”或者“rollback transaction;”進(jìn)行提交或回滾即可。另外在Core Data中大家也可以發(fā)現(xiàn),所有的增、刪、改操作之后必須調(diào)用上下文的保存方法,其實(shí)本身就提供了事務(wù)的支持,只要不調(diào)用保存方法,之前所有的操作是不會(huì)提交的。在FMDB中FMDatabase有beginTransaction、commit、rollback三個(gè)方法進(jìn)行開啟事務(wù)、提交事務(wù)和回滾事務(wù)。

10. 什么是沙盒機(jī)制?

每個(gè)iOS程序都有一個(gè)獨(dú)立的文件系統(tǒng)(存儲(chǔ)空間),而且只能在對(duì)應(yīng)的文件系統(tǒng)中進(jìn)行操作,此區(qū)域被稱為沙盒。應(yīng)用必須待在自己的沙盒里,其他應(yīng)用不能訪問該沙盒。

11. 沙盒目錄結(jié)構(gòu)是怎樣的?

沙盒結(jié)構(gòu)

Documents:常用目錄,iCloud備份目錄,存放數(shù)據(jù),這里不能存緩存文件,否則上架不被通過

Library

Caches:存放體積大又不需要備份的數(shù)據(jù),SDWebImage緩存路徑就是這個(gè)

Preference:設(shè)置目錄,iCloud會(huì)備份設(shè)置信息

tmp:存放臨時(shí)文件,不會(huì)被備份,而且這個(gè)文件下的數(shù)據(jù)有可能隨時(shí)被清除的可能

12. 使用 NSUserDefaults 時(shí),如何處理布爾的默認(rèn)值?(比如返回 NO,不知道是真的 NO 還是沒有設(shè)置過)

如果使用- (void)setBool:(BOOL)value forKey:(NSString *)defaultName;方法,來進(jìn)行存儲(chǔ),就可以獲取到正確的 bool 值

如果使用- (void)setObject:(nullable id)value forKey:(NSString *)defaultName;,需要在獲取到值后在轉(zhuǎn)為 bool類型

13. 代碼題目分析,打印結(jié)果是什么?

NSUserDefaults*userdefault = [NSUserDefaultsstandardUserDefaults];BOOLflag =NO;[userdefault setObject:@(flag) forKey:@"flag"];if([userdefault objectForKey:@"flag"]) {BOOLeq = [userdefault objectForKey:@"flag"];if(eq) {NSLog(@"a");? ? }else{NSLog(@"b");? ? }}else{BOOLeq = [userdefault objectForKey:@"flag"];if(eq) {NSLog(@"c");? ? }else{NSLog(@"d");? ? }}

打印結(jié)果 a

分析: 包裝成 oc 對(duì)象,OC對(duì)象有值,轉(zhuǎn) bool 都是 yes

11. 如果后期需要增加數(shù)據(jù)庫中的字段怎么實(shí)現(xiàn),如果不使用CoreData呢?

編寫SQL語句來操作原來表中的字段

增加表字段:ALTER TABLE 表名 ADD COLUMN 字段名 字段類型;

刪除表字段:ALTER TABLE 表名 DROP COLUMN 字段名;

修改表字段:ALTER TABLE 表名 RENAME COLUMN 舊字段名 TO 新字段名;

14.FMDB使用 線程與事務(wù)

FMDatabaseQueue 使用該類保證線程安全,串行隊(duì)列

事物是一個(gè)并發(fā)控制的基本單元,所謂的事務(wù),它是一個(gè)操作序列,這些操作要么都執(zhí)行,要么都不執(zhí)行,它是一個(gè)不可分割的工作單位。

15.xml 和 json 區(qū)別

XML的優(yōu)點(diǎn)

格式統(tǒng)一,符合標(biāo)準(zhǔn); 容易與其他系統(tǒng)進(jìn)行遠(yuǎn)程交互,數(shù)據(jù)共享比較方便。

XML的缺點(diǎn):

XML文件龐大,文件格式復(fù)雜,傳輸占帶寬;服務(wù)器端和客戶端都需要花費(fèi)大量代碼來解析XML,導(dǎo)致服務(wù)器端和客戶端代碼變得異常復(fù)雜且不易維護(hù);客戶端不同瀏覽器之間解析XML的方式不一致,需要重復(fù)編寫很多代碼;服務(wù)器端和客戶端解析XML花費(fèi)較多的資源和時(shí)間。

JSON的優(yōu)點(diǎn):

數(shù)據(jù)格式比較簡單,易于讀寫,格式都是壓縮的,占用帶寬小;易于解析,客戶端JavaScript可以簡單的通過eval()進(jìn)行JSON數(shù)據(jù)的讀取;支持多種語言,包括ActionScript, C, C#, ColdFusion, Java, JavaScript, Perl, PHP, Python, Ruby等服務(wù)器端語言,便于服務(wù)器端的解析;

JSON的缺點(diǎn):

沒有XML格式這么推廣的深入人心和喜用廣泛,沒有XML那么通用性;JSON格式目前在Web Service中推廣還屬于初級(jí)階段。

17.什么是事務(wù)?

作為單個(gè)邏輯工作單元執(zhí)行的一系列操作,而這些邏輯工作單元需要具有原子性,一致性,隔離性和持久性

是并發(fā)控制的基本單元。所謂的事務(wù),它是一個(gè)操作序列,這些操作要么都執(zhí)行,要么都不執(zhí)行,它是一個(gè)不可分割的工作單元。例如,銀行轉(zhuǎn)賬工作:從一個(gè)賬號(hào)扣款并使另一個(gè)賬號(hào)增款,這兩個(gè)操作要么都執(zhí)行,要么都不執(zhí)行。所以,應(yīng)該把它們看成一個(gè)事務(wù)。

事務(wù)是一種機(jī)制,用于維護(hù)數(shù)據(jù)庫的完整性

18. 熟悉常用SQL語句

create database namedrop database namealter table name add column coltypeselect * from table1wherecol=valueselect count as totalcount from table1select sum(field1) as sumvalue from table1'insert into table1 (field1,field2) values(value1,value2) 'delete from table1wheresomethingupdate table1setfield1=value1wherefield1 like ’%value1%'

參考:http://www.cnblogs.com/acpe/p/4970765.html

19.當(dāng)數(shù)據(jù)庫中的某項(xiàng)數(shù)據(jù)未 null 時(shí)候,通過FMDB獲取的數(shù)據(jù)為

[NSNull null]

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容