iOS之coreData
簡單說明
coreData是蘋果提供的數據本地化的解決方案中的一種,實質還是提供數據庫去存儲數據,只是在coreData中不需要程序員手動創建數據庫文件,由coreData自動創建。 coreData的核心文件和類 1.模型文件:后綴是.xcdatamodeld的文件,相當于數據庫文件(數據庫文件代言人) 2.實體:相當于表 3.實體類:存儲對象對應的類 4.上下文:關聯模型文件和實際生成的數據庫文件(對上下文的操作就相當于對數據庫進行操作) 使用步驟 1.創建模型文件(已經自動創建完成,但是要在創建工程的時候勾選coreData的選項)
2.創建實體(手動的在模型文件中添加一個實體,并且添加對應的屬性) 3.創建實體類(使用的時候直接使用類文件去操作屬性,不用導入類別文件(7.0以上才有)) 4.生成一個上下文(上下文已經自動生成,只需要直接拿過來使用) 5.數據的增刪改查(都是基于數據的查詢)1.獲取上下文
既然上面說到上下文是關聯模型文件和實際生成的數據庫文件,對上下文的操作就相當于是對數據庫進行操作,那么這里的上下文就相當于是一個數據庫操作者,那么我們就要獲取到這個上下文。 首先先聲明一個上下文
// 聲明上下文NSManagedObjectContext *_context; 復制代碼 // 1.獲取上下文(相當于打開數據庫)// 拿到應用程序的delegateAppDelegate *delegate = [UIApplication sharedApplication].delegate;_context = delegate.managedObjectContext; 復制代碼coreData還是對數據的操作,那就一定離不開數據的增刪改查。
2.增加數據
1.插入單條數據
// 1.創建需要插入的對象(可以像alloc出來的對象一樣的使用,只是多了一些功能)/*** @param NSString 實體名(相當于表名)* @return 上下文(相當于數據庫)*/Student *stu = [NSEntityDescription insertNewObjectForEntityForName:@"Student" inManagedObjectContext:_context]; 復制代碼 // 2.給對象的屬性進行賦值stu.name = @"wj";stu.age = @25;stu.sex = @"未知"; 復制代碼 // 3.保存數據庫// 參數:錯誤信息// 返回值:執行結果BOOL ret = [_context save:nil];if (ret) {NSLog(@"保存成功");}else {NSLog(@"保存失敗");} 復制代碼這樣就把一條數據插入到數據庫中去了,打印下沙盒路徑也可以去查找到數據的存在。 2.插入多條數據 插入多條數據可以使用一個for循環進行插入,簡單粗暴。
for (int i = 0; i < 10; ++i) {// 1.創建對象Student *stu2 = [NSEntityDescription insertNewObjectForEntityForName:@"Student" inManagedObjectContext:_context];// 2.給屬性賦值stu2.name = [NSString stringWithFormat:@"name%d",i];stu2.age = [NSNumber numberWithInteger:(arc4random() % 15 + 15)];stu2.sex = arc4random() % 2 == 0 ? @"男" : @"女";// 放到循環里的,執行的時候就一條一條的存入到數據庫中//[_context save:nil];}// 3.保存數據庫// 同時插入多條的數據時時運用的多線程,同時執行[_context save:nil];復制代碼從上面可以知道,數據的插入的會用到的方法為+ (__kindof NSManagedObject *)insertNewObjectForEntityForName:(NSString *)entityName inManagedObjectContext:(NSManagedObjectContext *)context;。 所以對數據插入后調用的方法為:- (BOOL)save:(NSError **)error;,表示對數據庫進行保存操作。
3.查詢數據
1.創建查詢對象
// 1.創建查詢對象// 參數:實體(相當于表名)NSFetchRequest *fetch_t = [NSFetchRequest fetchRequestWithEntityName:@"Student"]; 復制代碼這個name要和創建實體的名字一致。 2.直接查詢
// 1.直接查詢(將表中所有的數據全部獲取到)// 返回值:查詢結果NSArray *array = [_context executeFetchRequest:fetch_t error:nil];// 遍歷獲取所有的對象for (Student *stu in array) {[stu show];} 復制代碼3.按條件進行查詢 按條件進行查詢可以使用謂詞進行查詢,謂詞相當于就是一個查詢的條件而已。
// 1.創建條件對象// 參數:查詢條件NSPredicate *predicate = [NSPredicate predicateWithFormat:@"age < 18"];NSPredicate *predicate2 = [NSPredicate predicateWithFormat:@"age = 18 and sex = '男'"];// 條件:age的值不固定NSPredicate *predicate3 = [NSPredicate predicateWithFormat:@"age < %d",25];// 條件:值和屬性都不固定(屬性不固定,用K占位)NSPredicate *predicate4 = [NSPredicate predicateWithFormat:@"%K < %d", @"age", 30];// 2.給查詢對象添加條件[fetch_t setPredicate:predicate4];// 3.查詢結果NSArray *result = [_context executeFetchRequest:fetch_t error:nil];// 遍歷獲取的所有對象for (Student *stu2 in result) {[stu2 show];} 復制代碼4.查詢結果排序
// 1.創建一個排序對象// 參數1:排序的條件(按屬性進行排序)// 參數2:是否升序NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:YES];//2.設置查詢對象的排序屬性fetch_t.sortDescriptors = @[sort];// 3.查詢結果NSArray *sortAscend = [_context executeFetchRequest:fetch_t error:nil];for (Student *stu4 in sortAscend) {[stu4 show];} 復制代碼到這里后上下文會引用一個方法就是- (nullable NSArray *)executeFetchRequest:(NSFetchRequest *)request error:(NSError **)error;進行查詢。 查詢結果的顯示是在Student這個類寫了一個方法而已,
- (void)show {NSLog(@"%@ ~ %@ ~ %@",self.name, self.age, self.sex); } 復制代碼4.刪除數據
想要刪除數據,那么首先要得找到這條數據,所以我們要的使用查詢數據庫的手段,所以我們就得按照條件進行查詢數據。 1.數據的查詢
// 1.按條件將需要刪除的數據查詢出來NSFetchRequest *fetch_t = [NSFetchRequest fetchRequestWithEntityName:@"Student"];NSPredicate *pre = [NSPredicate predicateWithFormat:@"age < 25"];fetch_t.predicate = pre;NSArray *array = [_context executeFetchRequest:fetch_t error:nil]; 復制代碼2.刪除數據 按條件找到相應的數據了,就可以進行刪除了。
// 2.遍歷查詢結果,將結果中的對象刪除for (Student *stu in array) {// 我覺得這個地方應該在判斷下array到底有沒有值,沒有就直接返回,有值才去刪除操作[_context deleteObject:stu];} 復制代碼上面得到刪除數據的方法為:- (void)deleteObject:(NSManagedObject *)object;。
5.更新數據
其實說到底更新數據和刪除數據沒有多大的差別,在實現上來說,都需要按條件找到相應的數據,只是刪除的話是把數據刪除了,而更新是要把數據附上一個新的值而已,最后將數據庫進行保存。
// 1.按條件將需要刪除的數據查詢出來NSFetchRequest *fetch_t = [NSFetchRequest fetchRequestWithEntityName:@"Student"];NSPredicate *pre = [NSPredicate predicateWithFormat:@"age < 25"];fetch_t.predicate = pre;NSArray *array = [_context executeFetchRequest:fetch_t error:nil];// 2.遍歷查詢結果,將結果中的對象更新for (Student *stu in array) {stu.age = @20;}// 3.保存數據庫[_context save:nil]; 復制代碼coreData和sqlite3的比較
1.sqlite3是通過sql語句直接操作對象的屬性;而coreData是直接對對象進行操作的。而兩者都是直接或者間接對數據庫文件進行操作的。 2.sqlite3使用的時候更加靈活,但是需要sql語句,這不能有一點的寫錯了,再加上Xcode對sql語句沒有語法提示的。coreData不用sql語句編寫就可以操作數據庫的,但是對數據庫的操作還是不夠靈活(在runtime是不能使用coreData的,只能使用sqlite3或者是FMDB進行操作的)。 3.如果整個工程的數據結構比較簡單的時候,盡量的去使用coreData進行數據本地化的處理。
總結
以上是生活随笔為你收集整理的iOS之coreData的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: bug之bootstrap switch
- 下一篇: 工程实战-ES6环境配置