iOS | 面試知識(shí)整理 - 數(shù)據(jù)持久化(八)
1. iOS中數(shù)據(jù)持久化方案有哪些锅纺?
NSUserDefault簡(jiǎn)單數(shù)據(jù)快速讀寫
Property list(屬性列表)文件存儲(chǔ)
Archiver(歸檔)
SQLite本地?cái)?shù)據(jù)庫(kù)
CoreData
2. 什么是序列化和反序列化唉锌,用來(lái)做什么
序列化- 把對(duì)象轉(zhuǎn)化為字節(jié)序列的過(guò)程
反序列- 化把直接序列恢復(fù)成對(duì)象
作用- 把對(duì)象寫到文件或者數(shù)據(jù)庫(kù)中,并且讀取出來(lái)
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)庫(kù):
導(dǎo)入主頭文件:#import <sqlite3.h>
利用C語(yǔ)言函數(shù)創(chuàng)建\打開數(shù)據(jù)庫(kù)育苟,編寫SQL語(yǔ)句
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ù)庫(kù)文件中证逻,也能夠?qū)⒈4嬖跀?shù)據(jù)庫(kù)中的數(shù)據(jù)還原成OC對(duì)象乐埠,通過(guò)CoreData管理應(yīng)用程序的數(shù)據(jù)模型,可以極大程度減少需要編寫的代碼數(shù)量囚企!
6.? 簡(jiǎn)單描述下客戶端的緩存機(jī)制?
緩存可以分為:內(nèi)存數(shù)據(jù)緩存丈咐、數(shù)據(jù)庫(kù)緩存、文件緩存
每次想獲取數(shù)據(jù)的時(shí)候
先檢測(cè)內(nèi)存中有無(wú)緩存
再檢測(cè)本地有無(wú)緩存(數(shù)據(jù)庫(kù)\文件)
最終發(fā)送網(wǎng)絡(luò)請(qǐng)求
將服務(wù)器返回的網(wǎng)絡(luò)數(shù)據(jù)進(jìn)行緩存(內(nèi)存龙宏、數(shù)據(jù)庫(kù)棵逊、文件), 以便下次讀取
7. 什么是NSManagedObject模型银酗?
NSManagedObjcet是NSObject的子類辆影,Core Date的重要組成部分徒像。是一個(gè)通用類,實(shí)現(xiàn)了Core Date模型層所需的基本功能蛙讥,用戶可以通過(guò)NSManagedObjcet建立自己的數(shù)據(jù)模型锯蛀。
8. 說(shuō)一說(shuō)你對(duì)SQLite的認(rèn)識(shí)
SQLite是目前主流的嵌入式關(guān)系型數(shù)據(jù)庫(kù),其最主要的特點(diǎn)就是輕量級(jí)键菱、跨平臺(tái)谬墙,當(dāng)前很多嵌入式操作系統(tǒng)都將其作為數(shù)據(jù)庫(kù)首選。
9. 說(shuō)一說(shuō)你對(duì)FMDB的認(rèn)識(shí)
FMDB是一個(gè)處理數(shù)據(jù)存儲(chǔ)的第三方框架经备,框架是對(duì)sqlite的封裝拭抬,整個(gè)框架非常輕量級(jí)但又不失靈活性,而且更加面向?qū)ο蟆?/p>
我們知道直接使用libsqlite3進(jìn)行數(shù)據(jù)庫(kù)操作其實(shí)是線程不安全的侵蒙,如果遇到多個(gè)線程同時(shí)操作一個(gè)表的時(shí)候可能會(huì)發(fā)生意想不到的結(jié)果造虎。為了解決這個(gè)問(wèn)題建議在多線程中使用FMDatabaseQueue對(duì)象,相比FMDatabase而言纷闺,它是線程安全的算凿。
將事務(wù)放到FMDB中去說(shuō)并不是因?yàn)橹挥蠪MDB才支持事務(wù),而是因?yàn)镕MDB將其封裝成了幾個(gè)方法來(lái)調(diào)用犁功,不用自己寫對(duì)應(yīng)的sql而已氓轰。其實(shí)在在使用libsqlite3操作數(shù)據(jù)庫(kù)時(shí)也是原生支持事務(wù)的(因?yàn)檫@里的事務(wù)是基于數(shù)據(jù)庫(kù)的,F(xiàn)MDB還是使用的SQLite數(shù)據(jù)庫(kù))浸卦,只要在執(zhí)行sql語(yǔ)句前加上“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)用不能訪問(wèn)該沙盒蟀伸。
11. 沙盒目錄結(jié)構(gòu)是怎樣的蚀同?
沙盒結(jié)構(gòu)
Documents:常用目錄缅刽,iCloud備份目錄,存放數(shù)據(jù),這里不能存緩存文件,否則上架不被通過(guò)
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 還是沒(méi)有設(shè)置過(guò))
如果使用- (void)setBool:(BOOL)value forKey:(NSString *)defaultName;方法,來(lái)進(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ù)庫(kù)中的字段怎么實(shí)現(xiàn)髓霞,如果不使用CoreData呢卦睹?
編寫SQL語(yǔ)句來(lái)操作原來(lái)表中的字段
增加表字段: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)大量代碼來(lái)解析XML只磷,導(dǎo)致服務(wù)器端和客戶端代碼變得異常復(fù)雜且不易維護(hù)经磅;客戶端不同瀏覽器之間解析XML的方式不一致,需要重復(fù)編寫很多代碼钮追;服務(wù)器端和客戶端解析XML花費(fèi)較多的資源和時(shí)間预厌。
JSON的優(yōu)點(diǎn):
數(shù)據(jù)格式比較簡(jiǎn)單,易于讀寫元媚,格式都是壓縮的轧叽,占用帶寬小刊棕;易于解析炭晒,客戶端JavaScript可以簡(jiǎn)單的通過(guò)eval()進(jìn)行JSON數(shù)據(jù)的讀取甥角;支持多種語(yǔ)言网严,包括ActionScript, C, C#, ColdFusion, Java, JavaScript, Perl, PHP, Python, Ruby等服務(wù)器端語(yǔ)言,便于服務(wù)器端的解析嗤无;
JSON的缺點(diǎn):
沒(méi)有XML格式這么推廣的深入人心和喜用廣泛震束,沒(méi)有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ù)庫(kù)的完整性
18. 熟悉常用SQL語(yǔ)句
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ù)庫(kù)中的某項(xiàng)數(shù)據(jù)未 null 時(shí)候,通過(guò)FMDB獲取的數(shù)據(jù)為
[NSNull null]