iOS提供本地存儲和雲存儲(iCloud)方式。
本地存儲的五種機制:
- 屬性列表(類Android中的XML存儲方式):可以將集合對象以鍵值對的形式讀寫屬性列表(plist)中;
- NSUserDefaults(類Android中的SharePreferences的存儲方式):輕量級的存儲機制;
- 對象歸檔(類Android中的File序列化存儲):可以將對象的狀態保存到歸檔文件中;
- SQLite數據庫存儲(類Android中也有SQLite存儲):輕量級開源嵌入式數據庫,用於保存數據;
- CoreData:是一種對象關係映射技術(ORM)也是基於SQLite存儲的。
1.屬性列表:
屬性列表就是通過plist文件對數據進行存儲,plist其實是一種XML文件,在Foundation框架中的數組和字典等可以與屬性列表文件互相轉換。
屬性列表結構:由key/type/value,分別代表存儲數據的名稱(key)/存儲數據的類型(type)/名稱對應的值(value),當我們需要讀取相應字段(key)的值(value)即可。
寫入數據:NSSearchPathForDirectoriesInDomains方法搜索沙盒文件目錄,然後stringByAppendingString查找到wy.plist
//設置文件保存的路徑
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
//獲取document的路徑
NSString *documentPaths = [paths lastObject];
//定義路徑
NSString *savePath = [documentPaths stringByAppendingString:@"wy.plist"];
//開闢存儲
NSMutableDictionary *myData = [[NSMutableDictionary alloc]init];
//添加數據
[myData setObject:<#(nonnull id)#> forKey:<#(nonnull id<NSCopying>)#>];
//保存數據
[myData writeToFile:savePath atomically:YES];
讀出數據:
//通過路徑讀出文件數據
NSMutableDictionary *readData = [NSMutableDictionary dictionaryWithContentsOfFile:documentPaths];
2.沙盒(SandBox)和歸檔(Archive)(Android手機存放應用私有文件類似):
沙盒:存放iOS的各個app,每個app是獨立存儲的,且app之間數據是不能共享的,如要使用其他app的數據,那麼需要一些特殊API進行訪問。
- Documents目錄:該目錄用於存放app所有的資源文件和數據文件,文件夾重化工存放應用程序所有的文件和圖片資源;
- Library目錄:存放Preference和Caches目錄,Preference是存放應用程序的偏好設置,Caches是存放緩存數據;
- tmp目錄:存放的是臨時文件。
NSString *temDir = NSTemporaryDirectory();
歸檔:將對象寫入文件並保存在硬盤中,當再次打開應用時,可以還原對象。達到數據存儲的功能(對對象序列化和對象持久化),歸檔後的數據時加密的,所以讀取時需要進行解檔操作。
NSString *filePath = [NSHomeDirectory() stringByAppendingString:@"array.archive"];
BOOL success = [NSArchiver NSArchiveRootObject:data toFile:filePath ];
3.SQLite數據庫:
- 創建數據庫表:
使用sqlite3_open函數打開數據庫;
使用sqlite3_exec函數執行create table語句,創建數據表;
使用sqlite3_close函數關閉數據庫表,釋放資源
NSString *filePath = [NSHomeDirectory()stringByAppendingString:@"/student.sqlite"];
sqlite3 *sqlite = nil ;
int result = sqlite3_open([documentPaths UTF8String], &sqlite);
if (result != SQLITE_OK) {
NSLog(@"數據庫打開失敗!");
sqlite3_close(sqlite);
return;
}
char *error = nil;
NSString *sql = @"CREATE TABLE IF NOT EXISTS student(usename TEXT primary key,password TEXT,age TEXT)";
result = sqlite3_exec(sqlite, [sql UTF8String], NULL, NULL, &error);
if (result != SQLITE_OK) {
NSLog(@"創建表失敗:%s",error);
return;
}
sqlite3_close(sqlite);
- 插入數據:
使用sqlite3_open函數打開數據庫;
使用sqlite3_prepare函數對SQL語句進行編譯;
使用sqlite3_bind_text函數對數據進行插入;
使用sqlite3_step函數執行SQL插入語句;
使用sqlite3_finalize函數關閉數據庫句柄;
使用sqlite3_close函數關閉數據庫釋放資源。
NSString *filePath = [NSHomeDirectory()stringByAppendingString:@"/student.sqlite"];
sqlite3 *sqlite = nil ;
sqlite3_stmt *stmt = nil;
int result = sqlite3_open([documentPaths UTF8String], &sqlite);
if (result != SQLITE_OK) {
NSLog(@"數據庫打開失敗!");
sqlite3_close(sqlite);
return;
}
char *error = nil;
NSString *sql = @"INSERT INTO student(username,password,age) VALUES(?,?,?)";
sqlite3_prepare(sqlite, [sql UTF8String], -1, &stmt, NULL);
sqlite3_bind_text(stmt, 1, [@"wy" UTF8String], -1, NULL);
result = sqlite3_step(stmt);
if (result == SQLITE_ERROR || result == SQLITE_MISUSE) {
NSLog(@"執行SQL語句失敗");
return;
}
sqlite3_finalize(stmt);
sqlite3_close(sqlite);
- 查詢數據:
使用sqlite3_open函數打開數據庫;
使用sqlite3_prepare函數對SQL語句進行編譯;
使用循環語句執行sqlite3_step函數進行查詢;
使用sqlite3_finalize函數關閉數據庫句柄;
使用sqlite3_close函數關閉數據庫釋放資源。
NSString *filePath = [NSHomeDirectory()stringByAppendingString:@"/student.sqlite"];
sqlite3 *sqlite = nil ;
sqlite3_stmt *stmt = nil;
int result = sqlite3_open([filePath UTF8String], &sqlite);
if (result != SQLITE_OK) {
NSLog(@"數據庫打開失敗!");
sqlite3_close(sqlite);
return;
}
NSString *sql = @"SELECT username,password,age FORM student";
sqlite3_prepare_v2(sqlite, [sql UTF8String], -1, &stmt, NULL);
sqlite3_bind_text(stmt, 1, [@"wy" UTF8String], -1, NULL);
result = sqlite3_step(stmt);
while (result == SQLITE_ROW) {
char *username = (char *)sqlite3_column_text(stmt, 0);
//sql針對c結構的數據,所以用char接受賦值之後轉成對象
NSString *userName = [NSString stringWithCString:username encoding:NSUTF8StringEncoding];
//移動遊標指向下一條數據
result = sqlite3_step(stmt);
}
sqlite3_finalize(stmt);
sqlite3_close(sqlite);
4.獲取網絡資源:
在iOS中獲取網絡資源,也就是通過網絡下載相應文件或圖片保存到本地。
- NSData方法(屬於同步的方法):NSData是Object-C的數據類型,是NSObject的一個子類,用於保存數據的一個緩衝區區域,分爲不可變緩衝區(NSData)和可變緩衝區(NSMutableData),NSData支持URL方法,從網上下載文件或圖片保存到緩衝區中,用於顯示。
NSURL *url = [NSURL URLWithString:@"URL"];
NSData *dataUrl = [NSData dataWithContentsOfURL:url];
- NSURLRequest方法(異步的方法):
NSURL *url = [NSURL URLWithString:@"URL"];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc]init];
[request setURL:url];
[request setHTTPMethod:@"GET"];
[request setTimeoutInterval:60];
[NSURLConnection connectionWithRequest:request delegate:<#(nullable id)#>];
- ASIHttpRequest方法:
第三方網絡庫ASIHttpRequest可以將下載的圖片或文件保存在本地。