iOS Core Data 简单封装

简单示例一下,封装过后的使用效果。
存储一个对象

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值