我们在iOS开发中,常用的数据本地化存储方式无非就是这四种:1、属性列表;2、对象归档;3、SQLite3;4、CoreData;以上几种均较为常用,CoreData用的较少,就算项目中有所接触,精通的也不多。关于CoreData的基本概念介绍见:点我访问 。本文主要介绍CoreData的基本使用方法。好了,首先,创建一个CoreData项目,勾选CoreData选项。
然后,在项目中自动多出了几个文件,CoreDataDemo.xcdatamodeld ,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