iOS數(shù)據(jù)持久化

常用的持久化方式包括以下幾種:
1.NSUserDefaults (偏好設置)
2.plist存儲(屬性列表)
3.NSKeyedArchiver(歸檔序列化存儲)
4.SQLite3(iOS的嵌入式關系數(shù)據(jù)庫)
5.FMDB (對sqlite的封裝)
6.Core Data (蘋果提供的持久化工具)

一、NSUserDefaults (偏好設置)上篇介紹過就不再介紹

優(yōu)點:快速效率高,簡單易用
缺點:只能存儲常用的類型

二、plist存儲(屬性列表)

優(yōu)點:快速效率高
缺點:不靈活,只能存儲常用的類型
可以使用plist存儲的類型如下:NSArray、NSMutableArray、NSDictionary、NSMutableDictionary、NSData、NSMutableData、NSString、NSMutableString、NSNumber、NSDate

//寫入文件
NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *path = [doc stringByAppendingPathComponent:@"myself.plist"];
NSDictionary *dict = @{@"name": @"hello"};
[dict writeToFile:path atomically:YES];
//讀取文件
NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:path];

三、歸檔(NSCoding NSKeyedArchiver NSKeyedUnarchiver)

優(yōu)點:可以實現(xiàn)把自定義的對象存放在文件中
缺點:必須實現(xiàn)協(xié)議,浸入性強

需要保存的對象必須遵守NSCoding協(xié)議,并且實現(xiàn)該協(xié)議中- (void)encodeWithCoder:(NSCoder )aCoder和 - (id)initWithCoder:(NSCoder )aDecoder方法。

//寫入文件
//YXPerson.h文件如下:

@interface YXPerson : NSObject<NSCoding>
  @property(nonatomic,copy) NSString *name;
  @property(nonatomic,assign) int age;
  @end

//YXPerson.m文件如下:
 #import "YYPerson.h"

  @implementation YYPerson
  -(void)encodeWithCoder:(NSCoder *)aCoder{
      [aCoder encodeObject:self.name forKey:@"name"];
      [aCoder encodeInteger:self.age forKey:@"age"];
  }
  -(id)initWithCoder:(NSCoder *)aDecoder{
      if (self=[super init]) {
          self.name=[aDecoder decodeObjectForKey:@"name"];
          self.age=[aDecoder decodeIntegerForKey:@"age"];
      }
      return self;
  }
  @end

寫入和讀取:

 //寫入對象
    YXPerson *p=[[YXPerson alloc]init];
    p.name=@"hello";
    p.age=27;
    NSString *docPath=[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];
    NSString *path=[docPath stringByAppendingPathComponent:@"person.hello"];

    [NSKeyedArchiver archiveRootObject:p toFile:path];

     //讀取對象
     YXPerson *p=[NSKeyedUnarchiver unarchiveObjectWithFile:path];

四、SQLite3(iOS的嵌入式關系數(shù)據(jù)庫)

優(yōu)點:靈活、存儲大批量的數(shù)據(jù)
缺點:使用復雜、性能需要自行優(yōu)化

- (void)openDB{
    //獲取數(shù)據(jù)庫文件路徑
    NSString *doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSString *fileName = [doc stringByAppendingPathComponent:@"students.sqlite"];

    //將OC字符串轉換為c語言的字符串
    const char *cfileName = fileName.UTF8String;

    //打開數(shù)據(jù)庫文件(如果數(shù)據(jù)庫文件不存在,那么該函數(shù)會自動創(chuàng)建數(shù)據(jù)庫文件)
    int result = sqlite3_open(cfileName, &_db);
    if (result == SQLITE_OK) {//打開成功
        NSLog(@"成功打開數(shù)據(jù)庫");
    }else{
        NSLog(@"打開數(shù)據(jù)庫失敗");
    }
}


- (void)createTable{
    //創(chuàng)建表
    const char *sql = "CREATE TABLE IF NOT EXISTS t_student(id integer PRIMARY KEY AUTOINCREMENT,name text NOT NULL,age integer NOT NULL);";
    char *errmsg= NULL;
    int result = sqlite3_exec(_db, sql, NULL, NULL, &errmsg);
    if (result==SQLITE_OK) {
        NSLog(@"創(chuàng)建表成功");
    }else{
        NSLog(@"創(chuàng)建表失敗---%s",errmsg);
    }
}


- (void)insertData{
    //插入數(shù)據(jù)
    for (int i=0; i<10; i++) {
        //拼接sql語句
        NSString *name = [NSString stringWithFormat:@"hello--%d",arc4random_uniform(100)];
        int age = arc4random_uniform(20)+10;
        NSString *sql = [NSString stringWithFormat:@"INSERT INTO t_student (name,age) VALUES ('%@',%d);",name,age];

         //執(zhí)行SQL語句
        char *errmsg = NULL;
        sqlite3_exec(_db, sql.UTF8String, NULL, NULL, &errmsg);
        if (errmsg) {//如果有錯誤信息
            NSLog(@"插入數(shù)據(jù)失敗--%s",errmsg);
        }else{
            NSLog(@"插入數(shù)據(jù)成功");
        }
    }
}


- (void)deleteData{
    //刪除age小于15的數(shù)據(jù)
    NSString *sql = [NSString stringWithFormat:@"DELETE FROM t_student WHERE age<15"];
    char *errmsg = NULL;
    sqlite3_exec(_db, sql.UTF8String, NULL, NULL, &errmsg);
    if (errmsg) {
        NSLog(@"刪除數(shù)據(jù)失敗");
    }else{
        NSLog(@"刪除數(shù)據(jù)成功");
    }
}

- (void)updateData{
    //大于20歲的都置為20歲
    NSString *sql = [NSString stringWithFormat:@"UPDATE t_student set age=20 WHERE age>20"];
    char *errmsg = NULL;
    sqlite3_exec(_db, sql.UTF8String, NULL, NULL, &errmsg);
    if (errmsg) {
        NSLog(@"更新數(shù)據(jù)失敗");
    }else{
        NSLog(@"更新數(shù)據(jù)成功");
    }
}


- (void)queryData{
    const char *sql = "SELECT id,name,age FROM t_student WHERE age<20";
    sqlite3_stmt *stmt = NULL;

    //進行查詢前的準備工作
    if(sqlite3_prepare_v2(_db, sql, -1, &stmt, NULL)==SQLITE_OK){//SQL語句沒有問題
        NSLog(@"查詢語句沒有問題");

        //每調用一次sqlite3_step函數(shù),stmt就會指向下一條記錄
        while (sqlite3_step(stmt)==SQLITE_ROW) {//找到一條記錄
            //取出數(shù)據(jù)
            //(1)取出第0個字段的值(int)
            int ID=sqlite3_column_int(stmt, 0);
            //(2)取出第一列字段的值(text)
            const unsigned char *name = sqlite3_column_text(stmt, 1);
            //(3)取出第二列字段的值(int)
            int age = sqlite3_column_int(stmt, 2);

            printf("%d %s %d\n",ID,name,age);
        }
    }else{
        NSLog(@"查詢語句有問題");
    }
}

五、FMDB (對sqlite的封裝)

優(yōu)點:是對sqlite的封裝,簡單易用,接口比原生的SQLite接口簡潔很多,提供一些多線程,緩存,線程池的功能
缺點:因為他是OC的語言封裝的,只能在iOS開發(fā)中使用

FMDB中重要的類
FMDatabase: 一個FMDatabase對象就代表一個單獨的SQLite數(shù)據(jù)庫, 用來執(zhí)行SQL語句
FMResultSet: 使用FMDatabase執(zhí)行查詢后的結果集
FMDatabaseQueue: 用于在多線程中執(zhí)行多個查詢或更新, 它是線程安全的

**步驟: **
1.下載FMDB文件 , 將FMDB文件添加到工程中
2.導入libsqlite3.0.tbd框架,導入頭文件FMDatabase.h
3.代碼實現(xiàn),與SQLite使用步驟相似, 創(chuàng)建數(shù)據(jù)庫路徑,獲得數(shù)據(jù)庫路徑, 打開數(shù)據(jù)庫,然后對數(shù)據(jù)庫進行增刪改查,關閉數(shù)據(jù)庫.

初始化數(shù)據(jù)庫:

- (void)createDataBase {
    // 獲取數(shù)據(jù)庫文件的路徑
    NSString *docPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
    NSString *path = [docPath stringByAppendingPathComponent:@"student.sqlite"];
    NSLog(@"path = %@",path);
    // 1..創(chuàng)建數(shù)據(jù)庫對象
    FMDatabase *db = [FMDatabase databaseWithPath:path];
    // 2.打開數(shù)據(jù)庫
    if ([db open]) {
        // do something
        NSLog(@"Open database Success");
    } else {
        NSLog(@"fail to open database");
    }
}

FMDB詳解,可參考:
iOS-FMDB詳解及使用

六、Core Data (蘋果提供的持久化工具)

Core Date是ios3.0后引入的數(shù)據(jù)持久化解決方案,它是是蘋果官方推薦使用的,不需要借助第三方框架。Core Date實際上是對SQLite的封裝,提供了更高級的持久化方式。在對數(shù)據(jù)庫操作時,不需要使用sql語句,也就意味著即使不懂sql語句,也可以操作數(shù)據(jù)庫中的數(shù)據(jù)。
優(yōu)點:相對于SQLite,更加簡便
缺點:對批量數(shù)據(jù)的處理執(zhí)行效率低
個人感覺Core Data使用體驗不太好,雖然簡化了sql語句,但是操作維護起來也很復雜。
有興趣可以參考:
iOS CoreData介紹和使用

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內容