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

iOS学习爬坑记录12:学习Core data简单的CURD

2015-01-08 09:52 513 查看
这是参考了前人工作“Core Data浅谈系列之二 : 简单的CURD”:http://blog.csdn.net/jasonblog/article/details/8526148

CURD指creat、update、retrieve和delete。把他的代码在Xcode 6.1下重现了一遍,中间遇到点错误,耽搁了两天,主要是这个项目在建工程的时候不添加core data支持(否则core data相关代码会出现在AppDelegate文件中),而且建立工程后不添加xcdatamodeld文件,都怪我理解不深。

相关代码如下:

ViewController.h文件

#import <UIKit/UIKit.h>
#import <CoreData/CoreData.h>

@interface ViewController : UIViewController

@property (nonatomic, retain) NSManagedObjectModel *managedObjectModel;
@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;
@property (nonatomic, retain) NSPersistentStoreCoordinator *persistentStoreCoordinator;

@end


ViewController.m文件

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.

[self createTeamWithName:@"Heat"city:@"Miami"];
[self createTeamWithName:@"Lakers"city:@"LA"];
[self saveContext];

NSArray *teamArray = [self fetchTeamList];
if (teamArray) {
for (NSManagedObject *teamObject in teamArray) {
NSString *teamName = [teamObject valueForKey:@"name"];
NSString *teamCity = [teamObject valueForKey:@"city"];
NSLog(@"Team info : %@, %@\n", teamName, teamCity);
}
}
}

- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

#pragma mark -
#pragma mark CURD Operations

- (BOOL)createTeamWithName:(NSString *)teamName city:(NSString *)teamCity
{
if (!teamName || !teamCity) {
return NO;
}

NSManagedObject *teamObject = [NSEntityDescription insertNewObjectForEntityForName:@"Team" inManagedObjectContext:self.managedObjectContext];
[teamObject setValue:teamName forKey:@"name"];
[teamObject setValue:teamCity forKey:@"city"];

return YES;
}

- (NSArray *)fetchTeamList
{
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:[NSEntityDescription entityForName:@"Team" inManagedObjectContext:self.managedObjectContext]];

NSError *error = NULL;
NSArray *array = [self.managedObjectContext executeFetchRequest:fetchRequest error:&error];
if (error) {
NSLog(@"Error : %@\n", [error localizedDescription]);
}

fetchRequest = nil;

return array;
}

#pragma mark -
#pragma mark Save Context

- (void)saveContext
{
NSError *error = NULL;
NSManagedObjectContext *moc = self.managedObjectContext;
if (moc && [moc hasChanges] && ![moc save:&error]) {
NSLog(@"Error %@, %@", error, [error localizedDescription]);
abort();
}
}

#pragma mark -
#pragma mark Core Data Stack

- (NSManagedObjectModel *)managedObjectModel
{
if (nil != _managedObjectModel) {
return _managedObjectModel;
}

_managedObjectModel = [NSManagedObjectModel mergedModelFromBundles:nil];
return _managedObjectModel;
}

- (NSManagedObjectContext *)managedObjectContext
{
if (nil != _managedObjectContext) {
return _managedObjectContext;
}

_managedObjectContext = [[NSManagedObjectContext alloc] init];

if (self.persistentStoreCoordinator) {
[_managedObjectContext setPersistentStoreCoordinator:self.persistentStoreCoordinator];
}

return _managedObjectContext;
}

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator
{
if (nil != _persistentStoreCoordinator) {
return _persistentStoreCoordinator;
}

NSString *storeType = NSSQLiteStoreType;
NSString *storeName = @"cdNBA.sqlite";

NSError *error = NULL;
NSURL *storeURL = [NSURL fileURLWithPath:[[self applicationDocumentsDirectory] stringByAppendingPathComponent:storeName]];

_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:self.managedObjectModel];
if (![_persistentStoreCoordinator addPersistentStoreWithType:storeType configuration:nil URL:storeURL options:nil error:&error]) {
NSLog(@"Error : %@\n", [error localizedDescription]);
NSAssert1(YES, @"Failed to create store %@ with NSSQLiteStoreType", [storeURL path]);
}

return _persistentStoreCoordinator;
}

#pragma mark -
#pragma mark Application's Documents Directory

- (NSString *)applicationDocumentsDirectory
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
return basePath;
}

@end


中间过程爬坑的时候,犯了两个错误,一次是添加了core data支持又添加了xcdatamodeld文件(这里写的core data相关代码和系统自动生成的core data代码还是有差别的),还有一次是添加了xcdatamodeld文件,只要你添加了一次,后面怎么调试都会报错“"NSInternalInconsistencyException', reason: 'This NSPersistentStoreCoordinator has no persistent stores. It cannot
perform a save operation.'"”,最后我参考了http://www.cnblogs.com/mybkn/archive/2012/09/03/2669412.html,把我手机上(真机调试)的调试应用删除,再编译运行就好了,记住,这里不能添加xcdatamodeld文件。

————————————————————————————————————————————————

这里更正一下,创建工程时添加core data支持也是可以的,而且可以减少代码量,只是需要稍作修改。而且,以后调试代码要注意,如果有本地文件,在真机上运行出错的时候会不妨把app删掉重新运行Xcode。在有core data支持后,ViewController.m代码全部如下:

#import "ViewController.h"
#import "AppDelegate.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
AppDelegate *appDelegate = [UIApplication sharedApplication].delegate;

[self createTeamWithName:@"Heat"city:@"Miami"];
[self createTeamWithName:@"Lakers"city:@"LA"];
[appDelegate saveContext];

NSArray *teamArray = [self fetchTeamList];
if (teamArray) {
for (NSManagedObject *teamObject in teamArray) {
NSString *teamName = [teamObject valueForKey:@"name"];
NSString *teamCity = [teamObject valueForKey:@"city"];
NSLog(@"Team info : %@, %@\n", teamName, teamCity);
}
}
}

- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

#pragma mark -
#pragma mark CURD Operations

- (BOOL)createTeamWithName:(NSString *)teamName city:(NSString *)teamCity
{
//managedObjectContext 定义在AppDelegate.h文件
AppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
NSManagedObjectContext *context = [appDelegate managedObjectContext];

if (!teamName || !teamCity) {
return NO;
}

NSManagedObject *teamObject = [NSEntityDescription insertNewObjectForEntityForName:@"Team" inManagedObjectContext:context];
[teamObject setValue:teamName forKey:@"name"];
[teamObject setValue:teamCity forKey:@"city"];

return YES;
}

- (NSArray *)fetchTeamList
{
//managedObjectContext 定义在AppDelegate.h文件
AppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
NSManagedObjectContext *context = [appDelegate managedObjectContext];

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[fetchRequest setEntity:[NSEntityDescription entityForName:@"Team" inManagedObjectContext:context]];

NSError *error = NULL;
NSArray *array = [context executeFetchRequest:fetchRequest error:&error];
if (error) {
NSLog(@"Error : %@\n", [error localizedDescription]);
}

//[fetchRequest release], fetchRequest = nil;

return array;
}

@end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: