您的位置:首页 > 移动开发 > IOS开发

iOS 7.1系统中 CoreData的使用方法

2014-05-16 14:53 387 查看
         我们在iOS开发中,常用的数据本地化存储方式无非就是这四种:1、属性列表;2、对象归档;3、SQLite3;4、CoreData;以上几种均较为常用,CoreData用的较少,就算项目中有所接触,精通的也不多。关于CoreData的基本概念介绍见:点我访问 。本文主要介绍CoreData的基本使用方法。好了,首先,创建一个CoreData项目,勾选CoreData选项。


然后,在项目中自动多出了几个文件,CoreDataDemo.xcdatamodeld
, Entity.h,Entity.m文件。单击CoreDataDemo.xcdatamodeld文件,选择Add Entity,然后编辑Entity属性。本文中以一个创建普通记事本为栗子,定义日记本的三个基本属性,分别为日记内容(body),类型选择 String。创建日期creatDate,类型为Date,日记标题title,类型选择Sting。(是不是跟数据库中建表的方式很像??)

好了,然后创建一个ViewController,界面布局:


  在AppDelegate中声明三个属性用来管理CoreData对象,#import <UIKit/UIKit.h>

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;

@property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext; //上下文对象
@property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel;
//数据模型对象
@property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator; //持久性存储区

- (void)saveContext;
- (NSURL *)applicationDocumentsDirectory;
    AppDelegate.m文件中自动生成了一系列方法,稍微改动下即可,主要做了四件事:
    1、初始化一个上下文对象;2、初始化一个数据模型类对象;3、初始化一个永久性存储区对象;4、获取应用文件路径;

    //初始化一个上下文对象
- (NSManagedObjectContext *)managedObjectContext
{
if (_managedObjectContext != nil) {
return _managedObjectContext;
}

NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
_managedObjectContext = [[NSManagedObjectContext alloc] init];
[_managedObjectContext setPersistentStoreCoordinator:coordinator];
}
return _managedObjectContext;
}

//初始化一个数据模型类对象
- (NSManagedObjectModel *)managedObjectModel
{
if (_managedObjectModel != nil) {
return _managedObjectModel;
}
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"CoreDataDemo" withExtension:@"momd"];
_managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
return _managedObjectModel;
}

//返回一个永久性存储区对象
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
if (_persistentStoreCoordinator != nil) {
return _persistentStoreCoordinator;
}

NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"CoreDataDemo.sqlite"];

NSError *error = nil;
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {

NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}

return _persistentStoreCoordinator;
}

#pragma mark - Application's Documents director
//应用文件路径
- (NSURL *)applicationDocumentsDirectory
{
return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}
    以上是完成基本的CoreData属性配置,完成后就可以实现CoreData的存储啦!
    首先,需要获取实体的对象数组。(里面存了多少篇日记。。。。)

   注意:设置检索哪种类型的实体对象的时候,这个@"Entity"名字必须与定义的实体名称一一对应!否则会找不到实体对象。//获取实体对象数组
- (NSMutableArray*)getEntitiesArray;
{
myDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];
//创建取回数据的请求
NSFetchRequest * requset = [[NSFetchRequest alloc] init];
//设置检索哪种类型的实体对象
NSEntityDescription * entity = [NSEntityDescription entityForName:@"Entity" inManagedObjectContext:myDelegate.managedObjectContext];
//设置请求实体
[requset setEntity:entity];
//指定对结果的排序方式
NSSortDescriptor * sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"creationDate" ascending:YES];
NSArray * sortDescriptions = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
[requset setSortDescriptors:sortDescriptions];

NSError * error = nil;
//执行获取数据的请求 返回数组
NSMutableArray * mutableArray = [[myDelegate.managedObjectContext executeFetchRequest:requset error:&error] mutableCopy];
if (!mutableArray) {
NSLog(@"Error:%@,%@",error,[error userInfo]);
}
return mutableArray;
}

然后,依次完成增删改查的四个接口。。尼玛是不是所有的数据操作都这个套路。。。

增加日记:

- (IBAction)addContent:(id)sender {

    

    Entity * entity = (Entity*) [NSEntityDescription insertNewObjectForEntityForName:@"Entity" inManagedObjectContext:myDelegate.managedObjectContext];

    [entity setTitle:self.titleTextField.text];

    [entity setCreationDate:[NSDate date]];

    [entity setBody:self.contentTextField.text];

    [_entries addObject:entity];

    NSError * error;

    BOOL isSavaSuccess = [myDelegate.managedObjectContext save:&error];

    if (!isSavaSuccess) {

        NSLog(@"保存失败");

    }

    else{

        NSLog(@"保存成功");

    }

}

    修改日记:

//更新操作
- (IBAction)updateContent:(id)sender {
Entity * entity = [_entries objectAtIndex:1];
[self updateEntry:entity];
}
//更新操作
-(void)updateEntry:(Entity *)entry
{
[entry setTitle:self.titleTextField.text];
[entry setBody:self.contentTextField.text];
[entry setCreationDate:[NSDate date]];
NSError *error;
BOOL isUpdateSuccess = [myDelegate.managedObjectContext save:&error];
if (!isUpdateSuccess) {
NSLog(@"Error:%@,%@",error,[error userInfo]);
}
}


查询日记:
- (IBAction)queryContent:(id)sender {

NSLog(@"The count of entry is %d",_entries.count);
for (Entity * entry in _entries) {

NSLog(@"标题:%@, 内容:%@, 日期:%@",entry.title,entry.body,entry.creationDate);
}
}


删除日记:
- (IBAction)deleteContent:(id)sender {
for (Entity * entry in _entries) {
[self deleteEntry:entry];
}
//删除操作
-(void)deleteEntry:(Entity *)entry
{
[myDelegate.managedObjectContext deleteObject:entry];
[self.entries removeObject:entry];
NSError *error;
if (![myDelegate.managedObjectContext save:&error]) {
NSLog(@"Error:%@,%@",error,[error userInfo]);
}
}
好了,基本效果粗来了,运行一下:
最后查询一下结果:

 2014-05-16 14:53:57.663 CoreDataDemo[6766:90b] 保存成功

2014-05-16 14:53:58.309 CoreDataDemo[6766:90b] The count of entry is 2

2014-05-16 14:53:58.310 CoreDataDemo[6766:90b] 标题:diyige ,  内容:zhe ge shi wo de di yi pian, 日期:2014-05-16 06:41:45 +0000

2014-05-16 14:53:58.311 CoreDataDemo[6766:90b] 标题:new dirarauy,  内容:xin de ri ji yo!!, 日期:2014-05-16 06:53:57 +0000
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐