iOS數據存儲學習筆記

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可以將下載的圖片或文件保存在本地。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章