简单示例一下,封装过后的使用效果。
存储一个对象
Model *failedBankInfo = [[LYDataStore store] createEntityWithName:@"Model"];
Model.name = @"aaa";//给属性赋值
[[LYDataStore store] save];
查询
NSArray *fetchedObjects = [[LYDataStore store] executeFetchRequest:[[NSFetchRequest alloc] initWithEntityName:@"Model"]];
for (NSManagedObject *info in fetchedObjects) {
NSLog(@"%@", [info valueForKey:@"name"]);
}
下面直接上代码,首先是.h
#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>
@interface LYDataStore : NSObject
//! 返回托管对象上下文
@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext;
//! 这是管理数据对象关系的模型。如果应用程序不能够找到或加载它,将会导致严重错误。
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
//! 这是应用程序的持久存储协调器。它实现了创建并且返回一个协调器,基本上,插入数据,查询数据,删除数据的工作都在这里完成。
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator;
//! 获取store单例
+ (LYDataStore *)store;
//! 保存数据
- (void)save;
//! 获取应用程序文档目录
- (NSURL *)applicationDocumentsDirectory;
//! 创建一个实体
- (id)createEntityWithName:(NSString*)name;
//! 插入一个实体对象
- (void)insertObject:(NSManagedObject*)object;
//! 查询实体,返回一个数组
- (NSArray *)executeFetchRequest:(NSFetchRequest *)request;
//! 清空某个表
- (void)deleteEntitiesWithName:(NSString*)enitityName;
//! 查询实体的数量
- (NSUInteger)countForFetchRequest:(NSFetchRequest *)request;
@end
.m文件代码
#import "LYDataStore.h"
@implementation LYDataStore
static LYDataStore *_store;
@synthesize managedObjectContext = _managedObjectContext;
@synthesize managedObjectModel = _managedObjectModel;
@synthesize persistentStoreCoordinator = _persistentStoreCoordinator;
- (NSURL *)applicationDocumentsDirectory {
//这个是应用程序用来存储Core Data文件的目录。这行代码使用了一个叫做CoreData的文件,保存在documents目录下
return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}
- (NSManagedObjectModel *)managedObjectModel {
if (_managedObjectModel != nil) {
return _managedObjectModel;
}
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"CoreData" withExtension:@"momd"];
_managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
return _managedObjectModel;
}
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (_persistentStoreCoordinator != nil) {
return _persistentStoreCoordinator;
}
//创建协调器和存储
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"CoreData.sqlite"];
NSError *error = nil;
NSString *failureReason = @"创建或加载应用程序保存过的数据,失败了。";
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
// Report any error we got.
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
dict[NSLocalizedDescriptionKey] = @"初始化应用程序保存的数据,失败了。";
dict[NSLocalizedFailureReasonErrorKey] = failureReason;
dict[NSUnderlyingErrorKey] = error;
error = [NSError errorWithDomain:@"YOUR_ERROR_DOMAIN" code:9999 userInfo:dict];
//替换本行代码来对错误进行适当的处理
//abort() 引起应用发生一条崩溃的记录和终止。你不应该在一个shipping应用程序使用这个函数,虽然它在开发过程中可能是有用的。
NSLog(@"未解决的错误 %@, %@", error, [error userInfo]);
abort();
}
return _persistentStoreCoordinator;
}
- (NSManagedObjectContext *)managedObjectContext {
//返回应用程序的托管对象上下文(前提是已经绑定到应用程序的持久存储协调器)
if (_managedObjectContext != nil) {
return _managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (!coordinator) {
return nil;
}
_managedObjectContext = [[NSManagedObjectContext alloc] init];
[_managedObjectContext setPersistentStoreCoordinator:coordinator];
return _managedObjectContext;
}
+ (LYDataStore *)store {
if (_store == nil) {
_store = [[LYDataStore alloc] init];
[_store managedObjectContext];
}
return _store;
}
#pragma mark - Core Data Saving support
- (void)save{
NSManagedObjectContext *managedObjectContext = self.managedObjectContext;
if (managedObjectContext != nil) {
NSError *error = nil;
if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) {
//替换本行代码来对错误进行适当的处理
//abort() 引起应用发生一条崩溃的记录和终止。你不应该在一个shipping应用程序使用这个函数,虽然它在开发过程中可能是有用的。
NSLog(@"未解决的错误 %@, %@", error, [error userInfo]);
abort();
}
}
}
- (id)createEntityWithName:(NSString*)name {
if (!name.length) {
return nil;
}
NSEntityDescription* entityDescription = [NSEntityDescription entityForName:name inManagedObjectContext:_managedObjectContext];
if (!entityDescription) {
return nil;
}
return [[NSClassFromString(name) alloc] initWithEntity:entityDescription
insertIntoManagedObjectContext:_managedObjectContext];
}
- (void)insertObject:(NSManagedObject*)object {
if (object == nil) {
return;
}
@synchronized(self) {
NSManagedObjectContext* context = self.managedObjectContext;
[context performBlock:^{
[context insertObject:object];
}];
}
}
- (NSArray *)executeFetchRequest:(NSFetchRequest *)request{
if (request == nil) {
return nil;
}
@synchronized(self) {
NSError *error;
return [self.managedObjectContext executeFetchRequest:request error:&error];
}
}
- (void)deleteEntitiesWithName:(NSString*)enitityName {
if (!enitityName.length) {
return;
}
@synchronized(self) {
NSManagedObjectContext* context = self.managedObjectContext;
[context performBlock:^{
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:enitityName];
[request setIncludesPropertyValues:NO]; //only fetch the managedObjectID
NSError *error = nil;
NSArray* fetchResults = [self.managedObjectContext executeFetchRequest:request error:&error];
for (NSManagedObject* object in fetchResults) {
[context deleteObject:object];
}
}];
}
}
- (NSUInteger)countForFetchRequest:(NSFetchRequest *)request{
if (request == nil) {
return 0;
}
@synchronized(self) {
NSError *error;
return [self.managedObjectContext countForFetchRequest:request error:&error];
}
}
@end