CoreData
CoreData中几乎不用写数据库操作语句就能完成数据的本地化存储。
CoreData和iOS中的模型对象相联系在一起,只需要操作模型对象的增删改查就可以完成数据的增删改查,不用写SQL语句。
CoreData的存储方式
SQLite NSSQLiteStoreType
XML NSXMLStoreType
Binary NSBinaryStoreType
内存存储 NSInMemoryStoreType
CoreData的核心对象
NSManagedObjectContext 用途:负责应用与数据库之间的交互
NSPersistentStoreCoordinator 用途:添加持久化数据库,如SQLite
NSManagedObjectModel 用途:代表CoreData的模型文件
NSEntityDescription 用途:用于描述实体
CoreData的使用步骤
创建模型文件【相当于创建数据库】
添加实体【相当于创建表】
创建实体类【相当于创建模型】
生成上下文文件,关联模型文件生成数据库
保存对象到数据库
从数据库获取对象
更新数据
删除数据
创建上下文
配置好后,创建文件:
创建完成。
接着配置一下工程项目配置:
然后在需要用到数据库的地方importCoreData框架,才可以使用CoreData相关的API。
这个时候如果编译上有遇到重复编译相关文件的错误提示的话,那就去这个地方将相关的提示文件删除即可。
然后再需要调用的地方生成上下文,上下文是用来关联数据文件(CoreData__1.xcdatamodeld)的。
- (void)initCoreDataContext{
//生成上下文,关联数据文件
NSManagedObjectContext* context = [[NSManagedObjectContext alloc]init];
//创建模型对象:mergedModelFromBundles:nil传入nil,会将bundle下所有的模型文件都关联起来
NSManagedObjectModel* model = [NSManagedObjectModel mergedModelFromBundles:nil];
//创建持久化调度器:
NSPersistentStoreCoordinator* store = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
//获取存储数据库的名字
//创建获取error的变量,用于接收错误
NSError* error = nil;
//创建数据库的存储路径:
NSString* doc = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString* sqlitePath = [doc stringByAppendingPathComponent:@"CoreData__1.sqlite"];
NSURL* sqlURL = [NSURL fileURLWithPath:sqlitePath];
NSLog(@"数据库位置:%@",sqlitePath);
[store addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:sqlURL options:nil error:&error];
context.persistentStoreCoordinator = store;
self.context = context;
}
运行查看下文件路径有没有创建数据库文件:
2022-03-04 14:44:09.148267+0800 CoreData实践1[70691:2979529] 数据库位置:/Users/housnk/Library/Developer/CoreSimulator/Devices/1BD9D98C-0C2C-4F1A-8ADD-9158B1C4C938/data/Containers/Data/Application/6DBDFD9C-0D7E-449C-8B92-669DC0C0133F/Documents/CoreData__1.sqlite
用文件夹前往文件所在的位置:
文件已生成没错。
添加数据
接着我们再创建一个方法用于添加数据:
PS:记得导入模型头文件。
#import "CoreData/Person+CoreDataProperties.h"
- (void)addInfo:(NSString*)name age:(int64_t)age{
//用上下文来创建一个模型对象
Person* person = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:self.context];
//给该模型对象赋值
int numberID = arc4random()%10000;
person.name = [NSString stringWithFormat:@"personSomeone%d",numberID];
//旧版本的CoreData会将基本数据类型如Int、Float等包装成NSNumber对象,这里是新版本不用。
int64_t personAge = arc4random()%100;
person.age = personAge;
//通过上下文保存:
//创建一个error用于接收错误,如果有错误的话。
NSError* error = nil;
[self.context save:&error];
if (error) {
NSLog(@"保存失败,错误信息:%@",error);
}else{
NSLog(@"保存成功");
}
}
然后再运行一下,同样需要重新进入一下文件路径,因为每次编译后,其文件路径都有可能会改变。
运行结果:
2022-03-04 14:50:37.138301+0800 CoreData实践1[<