GeekBand iOS開發(fā)高級進(jìn)階學(xué)習(xí)筆記(第四周)

簡易數(shù)據(jù)存儲

數(shù)據(jù)持久化分為本體持久化和云端持久化
本體持久化可以存在本地文件或數(shù)據(jù)庫碱屁。
云端可以存在iCloud蛾找,存在iCloud的數(shù)據(jù)可以是文件,也可以是Key-Value數(shù)據(jù)庫打毛。云端也可以將數(shù)據(jù)存在第三方的網(wǎng)絡(luò)服務(wù)器上。

NSData
NSData是一個表示通用數(shù)據(jù)的類幻枉。可以進(jìn)行讀展辞、寫和訪問內(nèi)存里的內(nèi)容。

圖片
創(chuàng)建UIImage對象
文件在bundle中
NSData
CGContext
CGImageRef CGBitmapContextCreateImage(ctx);
保存 UIImage對象
via data

NSData *UIImagePNGRepresentaion(UIImage *image);
NSData *UIImageJPEGRepresentaion(UIImage *image, CGFloat compressionQuality);

NSString與存儲
NSString的存儲主要處理的是文本讀寫和文件路徑

Key Value數(shù)據(jù)

+(NSDictionary<KeyType, ObjectType>*)dictionaryWithContentsOfFile:(NSString*)
+(NSDictionary<KeyType, ObjectType>*)dictionaryWithContentsOfURL:(NSURL*)

-(BOOL)writeToFile:(NSString*)atomically:(BOOL)
-(BOOL)writeToURL:(NSURL*)atomically:(BOOL)

配置參數(shù)
配置參數(shù)用來保存默認(rèn)值洽腺,如果是用戶需要經(jīng)常修改的參數(shù)建議使用自己的UI覆旱,不常改的放在settings bundle。
Domain:
NSArgumentDomain:Xcode.app/Contents/MacOS/Xcode-IndexOnOpen NO
Application:NSUserDefaults
NSGlobalDomain:defaults read NSGlobalDomain
Languages:AppleLanguage 指定用戶使用的語言
NSRegistrationDomain:[NSUserDefaults registerDefaults:]提供的默認(rèn)值
Mac OS X 的 defaults 命令
defaults read<domain>[key]
defaults find Xcode.IDE

NSUserDefault
訪問

[NSUserDefaults standardUserDefaults] //拿回一個本地的default
[NSUbiquitousKeyValueStore defaultStore] //iCloud

登記默認(rèn)值
[NSUserDefaults registerDefaults:dict]
訪問
讀-<type>ValueForKey:
寫-set<Type>:forKey:

Settings Bundle
Settings.bundle in app root
Access via standardDefaults

沙盒扣唱、文件與對象歸檔

沙盒是在受限的安全環(huán)境中運(yùn)行應(yīng)用程序的一種做法团南,這種做法是要限制授予應(yīng)用程序的代碼訪問權(quán)限炼彪。

沙盒

NSHomeDirectory():
/Documents:程序的文件數(shù)據(jù)保存在該目錄下,iTunes備份時包括該目錄
/Library:存儲程序的默認(rèn)設(shè)置或其它狀態(tài)信息
/Library/Caches: 緩存文件辐马,iTunes不備份,不會再應(yīng)用退出刪除
/tmp:創(chuàng)建臨時文件的地方冗疮,重啟時會弄丟
NSString *NSTemporaryDirectory (void);
NSArray<NSString > NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory directory, NSSearchPathDomainMask domainMask, BOOL expandTilde);

模擬器沙盒的環(huán)境目錄
~/Library/Developer/CoreSimulator/Devices/
在MAC下運(yùn)行一下命名就可以看見
defaults write com.apple.finder AppleShowAllFiles -bool true

App Bundle


App Bundle

通用的文件管理需要使用NSFileManager檩帐。
獲取方法术幔,使用sharedManager //線程不安全
alloc-init //線程安全湃密,可以多線程操作
目錄
文件
安全性選項(xiàng):
NSFileProtectionComplete 完全保護(hù)
NSFileProtectionCompleteUnlessOpen 如果自己的程序打開過就可以訪問,適合有后臺任務(wù)的程序
NSFileProtectionCompleteUntilFirstUserAuthentication 只要用戶解鎖過這個設(shè)備揍障,就可以訪問

iTunes File Sharing
在Info.plist設(shè)置中將UIFileSharingEnabled設(shè)置為YES,就可以讓iTunes訪問到這個程序存貯的數(shù)據(jù)

應(yīng)用間共享文件
用戶授權(quán)+操作系統(tǒng)代為操作
本機(jī)“Open in"
-UIDocumentInteractionController

Open in的操作過程

文檔地址:https://developer.apple.com/library/ios/documentation/Miscellaneous/Reference/UTIRef/Articles/System-DeclaredUniformTypeIdentifiers.html

iCloud
-UIDocumentPickerViewController
iCloud文件上傳和下載需要時間毒嫡,操作同一文件可能引發(fā)沖突幻梯。但是iCloud在多部機(jī)器之間訪問同一個文件將會非常方便。
使用步驟:
Add the "iCloud"entitlement to your App ID
Add the "iCloud sontainers" entitlement to your App ID
Add the "iCloud" entitlement to your entitlement file
Link CloudKit.framework
通過iCloud讀取文件有兩種模式碘梢,一種是副本模式,把文件從網(wǎng)絡(luò)導(dǎo)入到本地使用煞躬。還有一種是直接訪問,提供一個URL通過URL來訪問文件在扰。


icloud副本模式
icloud直接訪問

對象歸檔


對象歸檔

對象歸檔的過程
存貯
1雷客、對象本身要準(zhǔn)守NSCoding協(xié)議。
2搅裙、按照協(xié)議寫一個編碼函數(shù)裹芝,將需要的字段寫進(jìn)去娜汁。
3嫂易、調(diào)用NSKeyedArchiver archiveRootObject
取出
1存炮、調(diào)用NSKeyedUnarchiver unarchiveObjectWithFile
2蜈漓、掉用initWithCoder方法讀取文件

SQLite3

SQL是關(guān)系數(shù)據(jù)庫,由表和字段組成融虽。可以使用關(guān)系運(yùn)算有额。
SQL語言
DML:SELECT/INSERT/UPGRADE/DELETE/MERGE
DDL:CREATE/ALTER/DROP
DCL:GRANT/REVOKE
TCL:ROLLBACK/SET TRANSACTION

SQLite是一個開源的嵌入式關(guān)系數(shù)據(jù)庫
項(xiàng)目主頁:http://www.sqlite.org
嵌入式意味著引入程序庫,而非與服務(wù)器通信
完整的SQLite SQL參考:http://www.sqlite.org/lang.html

數(shù)據(jù)表建立結(jié)構(gòu)

查詢數(shù)據(jù)庫
查詢數(shù)據(jù)庫

SQLite 刪除修改數(shù)據(jù)
刪除修改數(shù)據(jù)

在iOS中使用SQLite
鏈接libSQLite3.dylib
使用SQLite3函數(shù)
打開/新建數(shù)據(jù)庫文件
執(zhí)行SQL命令
關(guān)閉數(shù)據(jù)庫
使用SQLite

SQLite3的API是一個純C語言的API
SQLite3的API

FMDB
介紹網(wǎng)址:https://github.com/ccgus/fmdb
基本用法:
FMDatabase *db = [FMDatabase databaseWithPath:@"/tmp/tmp.db"];
[db open]
FMResultSet *rs = [db executeQuery:@"SELECT * FROM myTable"];
while([re next]){...}
[rs<type>ForColumnIndex:idx];
[db close];
更新語句
[db executeStatements:sql withResultBlock:^int(NSDictionary *dictionary){}]
[db executeUpdate:@"INSERT INTO authors(identifier, name, date, comment)VALUES(?,?,?,?)",@(identifier), name, date, comment?:[NSNull null]];

CoreData

CoreData是蘋果公司提供的對象持久化框架,他不是數(shù)據(jù)庫萤衰,通常使用數(shù)據(jù)庫作為底層存儲,也可以使用XML文件脆栋。
CoreData是由Managed Object Context, Persistent Store Coordinator, Persistent Object Store, Store File這四部分組成


CoreData的結(jié)構(gòu)

CoreData的使用
在項(xiàng)目開始時要勾選Use Core Data


Use Core Data

進(jìn)入項(xiàng)目后需要定義一個數(shù)據(jù)模型
CoreData 數(shù)據(jù)模型

之后AppDelegate.m文件中會自動幫我們生成一個context來存貯數(shù)據(jù)椿争。

存入對象的方法:

NSManagedObject *student = [NSEntityDescription insertNewObjectForEntityForName:@"Student" inManagedObjectContext:context]; //創(chuàng)建一個Student對象
[student setValue:@"Mike"forKey:@"name"];
[student setValue:[NSNumber numberWithInt:29]forKey:@"age"]; //填充屬性
NSManagedObject *work = [NSEntityDescription insertNewObjectForEntityForName:@"homeWork"inManagedObjectContext:context]; //創(chuàng)建一個Homework對象
[work setValue:@"123456"forKey:@"no"]; //建立關(guān)聯(lián)關(guān)系
[student setValue:work forKey:@"homeWork"];

NSError *error = nil;
BOOL success = [context save:&error]; //保存數(shù)據(jù)

查詢數(shù)據(jù)內(nèi)容

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Student"]; //查找一個名字叫Student的數(shù)據(jù)

//排序、過濾(名字用J開頭的數(shù)據(jù))
request.sortDescriptors = @[[NSSortDescriptor sortDescriptorWithKey:@"age" ascending:YES]];
request.predicate = [NSPredicate predicateWithFormat:@"name like %@",@"J"];

//執(zhí)行
NSError *error = nil;
NSArray *objs = [context executeFetchRequest:request error:&error];
if(error){[NSException raise:@"Query failed" format:@"%@", [error localizedDescription]];}

//遍歷結(jié)果
for (NSManagedObject *obj in objs){
  NSlog(@"name=%@", [obj valueForKey:@"name"]
}

刪除數(shù)據(jù)

[context deleteObject:managedObject];

NSError *error = nil;
[context save:&error];
if(error){
  [NSException raise:@"Failed to delete!"format:@"%@",[error localizedDescription]];
}

用NSFetchedResultsController簡化結(jié)果顯示


NSFetchedResultsController簡化結(jié)果顯示
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末褐捻,一起剝皮案震驚了整個濱河市椅邓,隨后出現(xiàn)的幾起案子柠逞,更是在濱河造成了極大的恐慌希坚,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件裁僧,死亡現(xiàn)場離奇詭異慕购,居然都是意外死亡茬底,警方通過查閱死者的電腦和手機(jī)沪悲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門阱表,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人最爬,你說我怎么就攤上這事“拢” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵帮坚,是天一觀的道長。 經(jīng)常有香客問我试和,道長,這世上最難降的妖魔是什么阅悍? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任局嘁,我火速辦了婚禮溉箕,結(jié)果婚禮上悦昵,老公的妹妹穿的比我還像新娘。我一直安慰自己但指,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布棋凳。 她就那樣靜靜地躺著,像睡著了一般剩岳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天勺良,我揣著相機(jī)與錄音骄噪,去河邊找鬼尚困。 笑死链蕊,一個胖子當(dāng)著我的面吹牛事甜,可吹牛的內(nèi)容都是我干的滔韵。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼奏属,長吁一口氣:“原來是場噩夢啊……” “哼潮峦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起忱嘹,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎拘悦,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體础米,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年医寿,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片靖秩。...
    茶點(diǎn)故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡竖瘾,死狀恐怖沟突,靈堂內(nèi)的尸體忽然破棺而出捕传,到底是詐尸還是另有隱情,我是刑警寧澤庸论,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布今野,位于F島的核電站,受9級特大地震影響条霜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜宰睡,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一气筋、第九天 我趴在偏房一處隱蔽的房頂上張望拆内。 院中可真熱鬧宠默,春花似錦麸恍、人聲如沸搀矫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至卦羡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背虚汛。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人要门。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像欢搜,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子炒瘟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容