上班几年了没用过这玩意,今天简单的测试了一下,记录一下。
首先创建项目的勾选上use core data
项目创建以后,会生成一个.xcdatamodeld结尾的文件
后面添加Model类,单击xcdatamodeld文件,左下角会有一个Add Entity的按钮,可以新增一个model类并且可以添加这个model的属性
设置上述之后就是自动创建文件了,打开xcode,桌面最上面单击Editor - Create NSManagedObject subclass,如图
接下来勾选上你的项目然后next,勾选新加的model然后next,会生成两个类
在添加完上面两个类以后,运行的时候报错了,而且这个错误不能点开查看,也不能生成日志文件,只知道解决办法。首先选中上方File,点击Project setting,将上面那个Build System修改成Legacy Build System
重新编译一下,只有一个错误了。第二个错误是由于重复导入的问题,选中工程,然后点击Build Phases,打开Compile Sources,会有一个Model名+CoreDataClass.m的文件,将这个删除掉重新编译
OK,到这里两个错误已经解决了。接下来就是使用了。
创建一个NSObject类,导入头文件#import <CoreData/CoreData.h>,直接上代码把。
这是自定义的LJCoreDataStackManager.h文件
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
#define kLJCoreDataStackManager [LJCoreDataStackManager shareInstance]
NS_ASSUME_NONNULL_BEGIN
@interface LJCoreDataStackManager : NSObject
+ (LJCoreDataStackManager *)shareInstance;
@property (nonatomic, strong) NSManagedObjectContext *context;
@property (nonatomic, strong) NSManagedObjectModel *model;
@property (nonatomic, strong) NSPersistentStoreCoordinator *dinator;
- (void)save;
@end
接下来是LJCoreDataStackManager.m文件
#import "LJCoreDataStackManager.h"
@implementation LJCoreDataStackManager
+ (LJCoreDataStackManager *)shareInstance
{
static LJCoreDataStackManager *manager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
manager = [[LJCoreDataStackManager alloc] init];
});
return manager;
}
- (NSManagedObjectContext *)context {
if (!_context) {
_context = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
_context.persistentStoreCoordinator = self.dinator;
}
return _context;
}
- (NSManagedObjectModel *)model {
if (!_model) {
_model = [NSManagedObjectModel mergedModelFromBundles:nil];
}
return _model;
}
- (NSPersistentStoreCoordinator *)dinator {
if (!_dinator) {
_dinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.model];
NSString *docStr = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *sqlPath = [docStr stringByAppendingPathComponent:@"person.sqlite"];
NSURL *url = [NSURL fileURLWithPath:sqlPath];
NSError *error;
[_dinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url options:nil error:&error];
if (error) {
NSLog(@"添加数据库失败:%@", error);
} else {
NSLog(@"添加数据库成功");
}
}
return _dinator;
}
- (void)save {
NSError *error = nil;
[self.context save:&error];
NSLog(@"保存数据 error = %@", error);
}
@end
下面是增加的代码
Person *person = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:kLJCoreDataStackManager.context];
person.age = [self.ageTextField.text intValue];
person.name = self.nameTextField.text;
[kLJCoreDataStackManager save];
查询所有
NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Person"];
self.datalist = [NSMutableArray arrayWithArray:[kLJCoreDataStackManager.context executeFetchRequest:request error:nil]];
按条件查询(使用NSPredicate)
NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Person"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"age >= 13"];
request.predicate = predicate;
NSArray<Person *> *arr = [kLJCoreDataStackManager.context executeFetchRequest:request error:nil];
删除
Person *person = [self.datalist objectAtIndex:indexPath.row];
[kLJCoreDataStackManager.context deleteObject:person];
记得删除之后调用一下context的save方法,同步到数据库,不然杀了进程重新进来以后数据又回来了。
先记录到这,后续再加。
一两年没有做ios的项目了,欢迎各位大佬为小弟来指点迷津。