本人有若干成套学习视频, 可试看! 可试看! 可试看, 重要的事情说三遍 包含Java
, 数据结构与算法
, iOS
, 安卓
, python
, flutter
等等, 如有需要, 联系微信tsaievan
.
如果要用最简洁的语言总结数据库的话,那就是四个字,增,删,查,改
先用思维导图来总结一下增删查改数据库的大致思路
可以看到
增加数据,必须用到实体描述器 NSEntityDescription, 是用这个来初始化对象的
删除数据,可以删除单个数据,但如果数据太多的话,要删除数据就很麻烦了,有一种暴力删除的方法就是删除整个数据库
查询数据,主要是要创建查询请求,对请求设定谓词以限定查询范围,执行查询请求
修改数据,先通过查询数据找到要修改的对象,然后对这个返回的对象直接进行修改,从这里可以看出 coreData 还是非常方便的
以上四点都不能忘记必须通过管理对象上下文保存
不多说,上代码,最好结合上一篇博客来看
- YFCoreDataManager.h/m 文件中增加不多,主要是增加了 删除所有数据库文件的 API
#pragma mark *** 清除数据库文件 ***
- (void)deleteAllDatabaseFiles
{
/* 先获取 Documents 文件夹中的文件地址 */
/* 要注意文件路径的拼接和转换 */
NSString *sqlitePath = [NSString stringWithFormat:@"%@.sqlite",kFileName];
NSString *shmPath = [NSString stringWithFormat:@"%@.sqlite-shm",kFileName];
NSString *walPath = [NSString stringWithFormat:@"%@.sqlite-wal",kFileName];
NSURL *sqliteUrl = [[[[NSFileManager defaultManager]URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject] URLByAppendingPathComponent:sqlitePath];
NSURL *shmUrl = [[[[NSFileManager defaultManager]URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject] URLByAppendingPathComponent:shmPath];
NSURL *walUrl = [[[[NSFileManager defaultManager]URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject] URLByAppendingPathComponent:walPath];
/* 然后用文件管理单例删除所有的文件 */
[[NSFileManager defaultManager]removeItemAtURL:sqliteUrl error:nil];
[[NSFileManager defaultManager]removeItemAtURL:shmUrl error:nil];
[[NSFileManager defaultManager]removeItemAtURL:walUrl error:nil];
[kYFCoreDataManager save];
}
- ViewController.m 中增加了增删改查四个方法
通过界面的四个按钮来对数据库进行简单的操作
#import "ViewController.h"
#import "Student+CoreDataProperties.h"
#import "YFCoreDataManager.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
}
#pragma mark *** 增加数据 ***
- (IBAction)addDataButtonAction:(UIButton *)sender {
Student *student = [NSEntityDescription insertNewObjectForEntityForName:@"Student" inManagedObjectContext:kYFCoreDataManager.managedObjectContext];
student.name = @"tsaievan";
student.age = @29;
[kYFCoreDataManager save];
}
#pragma mark *** 清除数据 ***
- (IBAction)clearDataButtonAction:(UIButton *)sender {
[kYFCoreDataManager deleteAllDatabaseFiles];
}
#pragma mark *** 查询数据 ***
- (IBAction)queryDataButtonAction:(UIButton *)sender{
// -------- 创建一个查询请求 --------
/* 记住这个关键类,NSFetchRequest */
/* 创建查询请求 */
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Student"];
/* 设置查询谓词,限定查询范围 */
/* 如果不设置查询谓词,则查出全部内容 */
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"name == %@",@"tsaievan"];
/* 执行查询请求,当然是管理对象上下文来执行查询请求 */
/* 要区别方法
* 一个是 executeFetchRequest,这个才是查询请求的方法
* 另一个是 executeRequest
*/
/* 这个方法返回的是一个对象数组 */
NSArray <Student *> *dataArray = [kYFCoreDataManager.managedObjectContext executeFetchRequest:fetchRequest error:nil];
NSLog(@"name:%@,age = %@",dataArray[0].name,dataArray[0].age);
}
#pragma mark *** 修改数据 ***
- (IBAction)updateDataButtonAction:(UIButton *)sender {
// -------- 修改数据的第一步仍然是查询数据,因为只有查到了数据才可以更改数据 --------
/* 创建查询请求 */
NSFetchRequest *fetchRequest = [NSFetchRequest fetchRequestWithEntityName:@"Student"];
/* 为查询请求设定谓词 */
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"age == %@",@29];
/* 执行查询请求 */
NSArray <Student *>*dataArray = [kYFCoreDataManager.managedObjectContext executeFetchRequest:fetchRequest error:nil];
/* 对执行对象的返回值直接进行修改 */
dataArray[0].name = @"tsaievan";
dataArray[0].age = @18;
/* 修改之后一定记得保存,切记 */
[kYFCoreDataManager save];
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end