域(Domain)
user defaults 數(shù)據(jù)庫中其實是由多個層級的域組成的,當你讀取一個鍵值的數(shù)據(jù)時,NSUserDefaults
從上到下透過域的層級尋找正確的值显蝌,不同的域有不同的功能沾谓,有些域是可持久的,有些域則不行墨闲。
- NSArgumentDomain (參數(shù)域): 有最高的優(yōu)先權(quán),在這里設(shè)置的參數(shù)可以覆蓋其他地方設(shè)置的參數(shù).
- ApplicationDomain (應(yīng)用域):最重要的域,它存儲著你app通過
NSUserDataults set...forKey
添加的設(shè)置. - NSGlobalDomain (全局域) :存儲著系統(tǒng)的設(shè)置
- Languages - Specific Domain (語言域): 包括地區(qū)、日期等
- NSRegistrationDomain (參數(shù)域) : 僅有較低的優(yōu)先權(quán)郑口,只有在應(yīng)用域沒有找到值時才從注冊域去尋找鸳碧。
注:這些域的優(yōu)先級順序是從上到下.
iOS Sandbox
對于一個iOS 程序來說,系統(tǒng)給它提供一個容器,用來存儲自己的信息.
每個ios應(yīng)用都有自己的應(yīng)用沙盒,應(yīng)用沙盒就是文件系統(tǒng)目錄犬性,與其他應(yīng)用放入文件 系統(tǒng)隔離瞻离,ios系統(tǒng)不允許訪問其他應(yīng)用的應(yīng)用沙盒.(也有例外,比如在用戶授權(quán)情況下訪問通訊錄乒裆,相冊等)
沙盒目錄結(jié)構(gòu)
App Bundle: 包含所有資源文件和可執(zhí)行文件
Documents: 保存應(yīng)用運行時生成的需要持久化的數(shù)據(jù)套利,iTunes會自動備份該目錄
tmp: 保存應(yīng)用運行時所需的臨時數(shù)據(jù),使用完畢后再將相應(yīng)的文件從該目錄刪除鹤耍,應(yīng)用沒有運行時肉迫,系統(tǒng)也可能會自動清理該目錄下的文件,iTunes不會同步該目錄稿黄,iPhone重啟時該目錄下的文件會丟失喊衫。
Libaray: 存儲程序的默認設(shè)置和其他狀態(tài)信息,iTunes會自動備份該目錄杆怕。
Libaray/Caches:存放緩存文件族购,iTunes不會備份此目錄,此目錄下文件不會在應(yīng)用退出刪除陵珍,一般存放體積比較大寝杖,不是很重要的資源
Libaray/Preferences:保存應(yīng)用的所有偏好設(shè)置,ios的Settings(設(shè)置)應(yīng)用會在該目錄中查找應(yīng)用的設(shè)置信息互纯,iTunes會自動備份該目錄瑟幕。
怎樣獲取文件路徑
iOS設(shè)備中每個文件都有路徑,這指的是文件在文件系統(tǒng)中的準確位置.要讓應(yīng)用程序能夠讀寫器沙盒中的文件,需要指定該文件的完整路徑.
Core Foundation提供了一個名為NSSearchDirectoriesInDomains的C語言函數(shù),他返回指向應(yīng)用程序的目錄Documents或Library/Caches的路徑.該函數(shù)可以返回多個目錄,因此該函數(shù)的返回結(jié)果是一個NSArray對象.使用該函數(shù)來訪問指定目錄Documents或Library/Caches的路徑時,它返回的數(shù)組將只包含一個NSString.
// 獲取沙盒主目錄路徑
NSString *homeDir = NSHomeDirectory();
// 獲取Documents目錄路徑
NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES) firstObject];
// 獲取Library的目錄路徑
NSString *libDir = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) firstObject];
// 獲取Caches目錄路徑
NSString *cachesDir = [NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES) firstObject];
// 獲取tmp目錄路徑
NSString *tmpDir = NSTemporaryDirectory();
讀寫數(shù)據(jù)
NSFileManager是一個單列類,也是一個文件管理器伟姐∈账眨可以通過NSFileManager創(chuàng)建文件夾、創(chuàng)建文件愤兵、寫文件鹿霸、讀文件內(nèi)容等等基本功能。
這里有一篇我覺得寫得挺好的: http://www.reibang.com/p/64b673ba551b
就不再啰嗦了
SQLite
想和大家分享一些新手入門寫得SQLite的數(shù)據(jù)庫簡單操作
我在這里使用的是第三方的庫:FMDB.不說廢話直接上代碼
這是一個用FMDB后寫得簡單的數(shù)據(jù)庫操作的類
AddressBookDataBase.h 文件
#import <FMDB/FMDB.h>
#import <Foundation/Foundation.h>
@interface AddressBookDataBase : NSObject
-(void)openDataBase:(FMDatabase *)DataBase;
-(FMDatabase *)createdDataBase;
-(void)closeDataBase:(FMDatabase *)DataBase;
-(void)insertDatatoDataBase:(FMDatabase *)DataBase nameIs:(NSString *) name phoneNumberIs: (NSString *) phoneNumber;
-(void)deleteDataFromDataBase:(FMDatabase *)DataBase nameIs: (NSString *) name;
-(void)modificationDataFromDataBase:(FMDatabase *)DataBase nameIs:(NSString *) name phoneNumberIs: (NSString *) phoneNumber originalName:(NSString *)originalName;
-(void)deleteTableFromDataBase:(FMDatabase *)DataBase table:(NSString *)tableName;
@end
AddressBookDataBase.m 文件
#import "AddressBookDataBase.h"
@implementation AddressBookDataBase
-(FMDatabase *)createdDataBase{
//創(chuàng)建打開數(shù)據(jù)庫
NSString * strPath = [NSHomeDirectory() stringByAppendingString:@"/Documents/AddressList.db"];
NSLog(@"%@",strPath);
FMDatabase * db = [FMDatabase databaseWithPath:strPath];
if (db != nil) {
NSLog(@"數(shù)據(jù)庫創(chuàng)建成功");
}
return db;
}
-(void)openDataBase: (FMDatabase *)DataBase{
BOOL isOpen = [DataBase open];
if (isOpen) {
NSLog(@"打開數(shù)據(jù)庫成功");
}
}
-(void)closeDataBase: (FMDatabase *)DataBase{
BOOL isClose = [DataBase close];
if (isClose) {
NSLog(@"關(guān)閉數(shù)據(jù)庫成功");
}
}
-(void)insertDatatoDataBase:(FMDatabase *)DataBase nameIs:(NSString *) name phoneNumberIs: (NSString *) phoneNumber {
NSString * strCreateTable = @"create table if not exists addressList(id integer primary key autoincrement,name varchar(20),phoneNumber varchar(20));";
//如果執(zhí)行成功 返回YES
BOOL isCreate = [DataBase executeUpdate:strCreateTable];
if(isCreate == YES){
NSLog(@"創(chuàng)建數(shù)據(jù)表成功");
}
NSString * strInsert = [NSString stringWithFormat:@"insert into addressList values(NULL,'%@','%@');",name,phoneNumber];
NSLog(@"%@",strInsert);
BOOL isOK = [DataBase executeUpdate:strInsert];
if (isOK == YES) {
NSLog(@"插入數(shù)據(jù)成功");
}
}
-(void)deleteDataFromDataBase:(FMDatabase *)DataBase nameIs:(NSString *) name{
NSString * strDelete = [NSString stringWithFormat:@"delete from addressList where name = '%@'",name];
NSLog(@"%@",strDelete);
BOOL isOK = [DataBase executeUpdate:strDelete];
if(isOK == YES){
NSLog(@"刪除成功");
}
}
-(void)modificationDataFromDataBase:(FMDatabase *)DataBase nameIs:(NSString *) name phoneNumberIs: (NSString *) phoneNumber originalName:(NSString *)originalName{
NSString* strModification = [NSString stringWithFormat:@"update addressList set phoneNumber = '%@', name = '%@' where name = '%@';",phoneNumber,name,originalName];
NSLog(@"%@",strModification);
BOOL isOk = [DataBase executeUpdate:strModification];
if(isOk ==YES){
NSLog(@"修改表成功!");
}
}
-(void)deleteTableFromDataBase:(FMDatabase *)DataBase table:(NSString *)tableName{
NSString* strDeleteTable = [NSString stringWithFormat:@"drop table %@",tableName];
BOOL isOk = [DataBase executeUpdate:strDeleteTable];
if(isOk ==YES){
NSLog(@"刪除表成功!");
}
}
@end
關(guān)于sqlite的一些語法的問題,這里給大家推薦一個網(wǎng)站
http://www.runoob.com/sqlite/sqlite-update.html.
里面關(guān)于SQLite的語句有詳細的語法講解,希望可以幫到大家.
總結(jié)
關(guān)于Domain的操作 實際上就是簡單的數(shù)據(jù)存儲操作.有時候人家說Domain 你可能不知道是什么意思.查查字典,Google 會知道的.而Domain又分了很多個Domain.所以很容易就弄混了.你需要知道這些Domain之間的區(qū)別.
關(guān)于NSSearchDirectoriesInDomains
該函數(shù)的返回值是一個NSString的數(shù)組.
這個函數(shù)有個domainMask
,這里只舉出NSUserDomainMask
.的情況.如果這里的參數(shù)寫的是這個NSUserDomainMask
.但是該數(shù)組將只有一個NSString對象.返回的就是你在NSHomeDirectory下查找Documents/Library文件夾的路徑.所以使用的時候直接用下標訪問就可以了.其他的請查閱NSSearchDirectoriesInDomains
API的說明