ios mysql管理_iOS开发--数据库管理CoreData的使用

[原创文章,转载请提前说明并附上原文链接]

CoreData是iOS5后,苹果提供的原生的用于对象化管理数据并且持久化的框架。CoreData本质上是将底层数据库封装成对象进行管理。但数据库实际上只是CoreData的一个功能,并不是全部功能。在iOS开发中,除了可以使用CoreData进行数据管理,还可以使用SQLite进行内存管理。并且有封装好SQLite代码的OC框架FMDB给我们使用。具体看我上篇文章。SQLite重要框架FMDB的使用.但对比SQLite,CoreData有下面几个优势。第一是CoreData作为苹果提供的原生框架,在内存方法比SQLite有性能上的优势。第二是CoreData操作数据不需要使用SQLite代码,使用方便。第三是CoreData把数据用面向对象方式进行管理,操作数据库更方便。

CoreData的核心是Core Data stack(技术栈堆)。CoreData就是依靠Core Data stack中的几个对象进行数据操作的。这几对象是:

NSManagedObjectContext ,管理对象的上下文: 负责管理模型对象的一个集合,

NSManagedObjectModel 被管理的对象模型

NSPersistentStoreCoordinator 存储调度器: 负责将数据保存到磁盘,

NSPersistentStore用于保存模型数据,受NSPersistentStoreCoordinator 存储调度器的操控。

这三个对象的关系如下面图片所示,苹果官方给出了这几个对向关系的图解。简单理解起来就是最上面的NSManagedObjectContext负责管理对象模型。然后将管理的对象模型发送给NSPersistentStoreCoordinator 存储调度器,存储调度器通过NSPersistentStore操作SQLite语句,将数据持久化到本地,保存到StoryFile中。

e7411f3ceeb6

Paste_Image.png

e7411f3ceeb6

Paste_Image.png

e7411f3ceeb6

Paste_Image.png

数据库的使用也很简单,我们只需要在创建项目文件的时候勾选使用coreData的选项,系统就会帮我们创建一个包含CoreData的项目文件。

e7411f3ceeb6

Paste_Image.png

然后在界面上就会出现下面的变化。我们点击添加属性按钮,就能在数据库中给数据模型添加属性。

e7411f3ceeb6

Paste_Image.png

添加完数据库后我们进行下面操作就能将数据模型转为代码文件。

e7411f3ceeb6

Paste_Image.png

做完上面操作之后我们就能对数据库模型进行操作了。

e7411f3ceeb6

Paste_Image.png

我们在操作数据,对数据进行增删改查的时候,都需要用到Core Data stack这个工具。我们自己可以封装一个Core Data stack,这样更能加深我们对Core Data stack这个工具的理解。

下面是封装一个工具类的代码:

首先是该工具类的.h文件中的代码

#import

#import

#define KXBCoreManagerInstance [HMCoreDataStackManager shareInstance]

@interface HMCoreDataStackManager : NSObject

///单例

+(HMCoreDataStackManager*)shareInstance;

///管理对象上下文

@property(strong,nonatomic)NSManagedObjectContext *managerContenxt;

///模型对象

@property(strong,nonatomic)NSManagedObjectModel *managerModel;

///存储调度器

@property(strong,nonatomic)NSPersistentStoreCoordinator *maagerDinator;

//保存数据的方法

-(void)save;

@end

然后是.m文件中的代码

#import "HMCoreDataStackManager.h"

@implementation HMCoreDataStackManager

///单例的实现

+(HMCoreDataStackManager*)shareInstance

{

static HMCoreDataStackManager *instance = nil;

static dispatch_once_t onceToken;

dispatch_once(&onceToken, ^{

instance = [[HMCoreDataStackManager alloc]init];

});

return instance;

}

-(NSURL*)getDocumentUrlPath

{

///获取文件位置

return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]

;

}

//懒加载managerContenxt

-(NSManagedObjectContext *)managerContenxt

{

if (_managerContenxt != nil) {

return _managerContenxt;

}

_managerContenxt = [[NSManagedObjectContext alloc]initWithConcurrencyType:NSMainQueueConcurrencyType];

///设置存储调度器

[_managerContenxt setPersistentStoreCoordinator:self.maagerDinator];

return _managerContenxt;

}

///懒加载模型对象

-(NSManagedObjectModel *)managerModel

{

if (_managerModel != nil) {

return _managerModel;

}

_managerModel = [NSManagedObjectModel mergedModelFromBundles:nil];

return _managerModel;

}

-(NSPersistentStoreCoordinator *)maagerDinator

{

if (_maagerDinator != nil) {

return _maagerDinator;

}

_maagerDinator = [[NSPersistentStoreCoordinator alloc]initWithManagedObjectModel:self.managerModel];

//添加存储器

/**

* type:一般使用数据库存储方式NSSQLiteStoreType

* configuration:配置信息 一般无需配置

* URL:要保存的文件路径

* options:参数信息 一般无需设置

*/

//拼接url路径

NSURL *url = [[self getDocumentUrlPath]URLByAppendingPathComponent:@"sqlit.db" isDirectory:YES];

[_maagerDinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:url options:nil error:nil];

return _maagerDinator;

}

-(void)save

{ ///保存数据

[self.managerContenxt save:nil];

}

通过上面代码可以看出封装一个Core Data stack类并不是很难,我们需要做的是创建一个单例,然后懒加载一个NSManagedObjectContext,并给NSManagedObjectContext添加存储调度器NSPersistentStoreCoordinator。

懒加载存储调度器的时候给存储调度器添加存储器PersistentStore。在最后提供一个保存数据的方法,每次我们修改数据库中文件数据的时候,都需要用Core Data stack调用save方法保存数据。

CoreData关于数据的操作无非就是增删改查。增删改查我们同样需要使用自定义的Core Data stack工具类。

增加数据:

Person *p = [NSEntityDescription insertNewObjectForEntityForName:@"Person" in Managed ObjectContext : kManagedObjectContext.managedObjectContext];

p.age = @(13);

p.name = @"张三";

[kManagedObjectContext save];

删除数据:

//1.创建一个查询请求

NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Person"];

//2.创建查询谓词(查询条件)

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == %@",@"张三"];

//3.给查询请求设置谓词

request.predicate = predicate;

//4.查询数据

NSArray *arr = [kManagedObjectContext.managedObjectContext executeFetchRequest:request error:nil];

//5.删除数据

[kManagedObjectContext.managedObjectContext deleteObject:arr.firstObject];

//6.同步到数据库 [kManagedObjectContext save];

修改数据:

//1.创建一个查询请求

NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Person"];

//2.创建查询谓词(查询条件)

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == %@",@"张三"];

//3.给查询请求设置谓词

request.predicate = predicate;

//4.查询数据

NSArray *arr = [kManagedObjectContext.managedObjectContext executeFetchRequest:request error:nil];

//5.改变数据

arr.firstObject.name = @"李四";

arr.firstObject.age = @(18);

//6.同步到数据库

[kManagedObjectContext save];

查询数据:

//1.创建一个查询请求

NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Person"];

//2.创建查询谓词(查询条件)

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == %@",@"张三"];

//3.给查询请求设置谓词

request.predicate = predicate;

//4.查询数据

NSArray *arr = [kManagedObjectContext.managedObjectContext executeFetchRequest:request error:nil]; NSLog(@"%@====%@",arr.firstObject.name,arr.firstObject.age);

使用CoreData我们可以轻松实现很多数据的操作,例如通讯录数据录的增删改查。

在这里提供一个通讯录数据操作的demo,使用CoreData,我们能轻松地实现通讯录功能。

CoreData实现通讯录

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值