在建好的项目中加入CoreData

   这几天在做一个ios的小项目,项目中需要对数据进行基本的增删改查操作。于是就想用一把CoreData。但在创建项目初期,没有包含进CoreData。于是就在已建好的项目中加入CoreData。由于第一次用CoreData,各方面还不是很熟悉,在网上爬文,找到了一篇关于这方面的文章(http://www.iteye.com/topic/1017633)。于是,自己在这篇文章的基础上经过一天的研究,特把自己出错的地方进行简单的总结。并把步骤完善一下。

  1.如果想在已建好的项目中加入CoreData,首先需要引入CoreData FrameWork。这里需要先点击target,然后再点击Build Phases,在下面的界面中找到LinkBinary With Libraries。点击箭头,展开这一项,然后再点击加号,出现Framework项界面。在搜索框中输入CoreData,这时出现CoreData.framework,选中它并点击Add按钮而加入CoreData FrameWork。这时会在target的下面出现CoreData.framework。为了文件的分类方便,可以把CoreData.framework拖入Frameworks中。然后保存就好了。然后在prefix.pch中加入#import<CoreData/CoreData.h>。


2.加入数据模型,点击iWeather文件夹,然后点击右键,再点击New File。在弹出的界面的左边点击IOS,选择下面的CoreData,然后再点击右边的Data Model,之后点击Next,进入下一页,在这里弹出的界面需要在Save As中的.xcdatamodeld之前写入你的数据模型的名字。这里的名字任意写。我这里写的与项目名一样为iWeather。点击Create,在Show the Project Navigation将创建出一个数据模型iWeather.xcdatamodeld。



3.做好以上的这些工作之后,不要先急着去创建Entity。而是去Delegate中建立CoreData与Delegate的关联。这时,点击LWTAppDelegate.h,在@interface与@end之中加入以下代码;

@property (readonly,strong,nonatomic)NSManagedObjectContext *managedObjectContext;

@property (readonly,strong,nonatomic)NSManagedObjectModel *managedObjectModel;

@property (readonly,strong,nonatomic)NSPersistentStoreCoordinator *persistentStoreCoordinator;

 

- (void)saveContext;

- (NSURL *)applicationDocumentsDirectory;

上面的代码有几个名字术语:NSManagedObjectContext,NSManagedObjectModel,NSPersistentStoreCoordinator。 

(1).Managed Object Model管理数据模型:你可以将西看作是数据或者里包含了各个体的定信息一般来你会使用我们刚刚视觉编辑器来操作个物体添加属性建立属性之的关系等等当然你也可以使用代

(2). Persistent Store Coordinator持久性数据协调 你可以将西看作是数据库连你将置数据存的名字和位置以及数据存

(3). Managed Object Context 管理数据内容你可以将一部分看作是数据的实际内容也是整个数据而言最重要的部分这还基本上插入数据查询数据除数据的工作都在里完成

上面这段对术语的解释摘自:http://www.dasheyin.com/ios_jiao_cheng_core_data_shu_ju_chi_jiu_xing_cun_chu_ji_chu_jiao_cheng.html

4.之后打开LWTAppDelegate.m文件,在@implementation下面写入如下代码:

@synthesize managedObjectContext =_managedObjectContext;

@synthesize managedObjectModel = _managedObjectModel;

@synthesize persistentStoreCoordinator = _persistentStoreCoordinator;

然后在@end之前加入以下代码:

//相当于保存数据的方法

- (void)saveContext

{

    NSError *error = nil;

    NSManagedObjectContext *managedObjectContext =self.managedObjectContext;

    if (managedObjectContext !=nil) {

        if ([managedObjectContexthasChanges] && ![managedObjectContextsave:&error]) {

            NSLog(@"Unresolvederror %@, %@", error, [erroruserInfo]);

            abort();

        }

    }

}

 

#pragma mark - Core Data stack

 

// Returns the managed object context for the application.

// If the context doesn't already exist, it is created and bound to thepersistent store coordinator for the application.

- (NSManagedObjectContext *)managedObjectContext

{

    if (_managedObjectContext !=nil) {

        return _managedObjectContext;

    }

   

    NSPersistentStoreCoordinator *coordinator = [selfpersistentStoreCoordinator];

    if (coordinator != nil) {

        _managedObjectContext = [[NSManagedObjectContextalloc]init];

        [_managedObjectContextsetPersistentStoreCoordinator:coordinator];

    }

    return _managedObjectContext;

}

 

// Returns the managed object model for the application.

// If the model doesn't already exist, it is created from the application'smodel.

- (NSManagedObjectModel *)managedObjectModel

{

    if (_managedObjectModel !=nil) {

        return _managedObjectModel;

}

//这里一定要注意,这里的iWeather就是你刚才建立的数据模型的名字,一定要一致。否则会报错。

    NSURL *modelURL = [[NSBundlemainBundle]URLForResource:@"iWeather"withExtension:@"momd"];

    _managedObjectModel = [[NSManagedObjectModelalloc]initWithContentsOfURL:modelURL];

    return _managedObjectModel;

}

 

// Returns the persistent store coordinator for the application.

// If the coordinator doesn't already exist, it is created and theapplication's store added to it.

- (NSPersistentStoreCoordinator *)persistentStoreCoordinator

{

    if (_persistentStoreCoordinator !=nil) {

        return _persistentStoreCoordinator;

    }

    //这里的iWeaher.sqlite,也应该与数据模型的名字保持一致。

    NSURL *storeURL = [[selfapplicationDocumentsDirectory]URLByAppendingPathComponent:@"iWeather.sqlite"];

   

    NSError *error = nil;

    _persistentStoreCoordinator = [[NSPersistentStoreCoordinatoralloc]initWithManagedObjectModel:[selfmanagedObjectModel]];

    if (![_persistentStoreCoordinatoraddPersistentStoreWithType:NSSQLiteStoreTypeconfiguration:nilURL:storeURLoptions:nilerror:&error]) {

        NSLog(@"Unresolvederror %@, %@", error, [erroruserInfo]);

        abort();

    }   

   

    return _persistentStoreCoordinator;

}

 

#pragma mark - Application's Documents directory

 

// Returns the URL to the application's Documents directory.

- (NSURL*)applicationDocumentsDirectory

{

    return [[[NSFileManagerdefaultManager]URLsForDirectory:NSDocumentDirectoryinDomains:NSUserDomainMask]lastObject];

}

到这里就做好了一切的准备工作了。然后去创建Entity吧。

5.打开iWeather.xcdatamodeld文件。通过Editor Style按钮调到视图模式下。如下图这样:


然后点击Add Entity按钮增加Entity。

这时咱们对Entity进行修改。点击Entity上,把那么修改为ArInfo。然后再点击AddAttribute按钮进行属性的添加。增加myid和myname这两个属性。属性类型都为String。

 


在做好这些之后,开始建立相应的.h和.m文件。右键点击iWeather文件夹,点击newFile,在弹出的窗口中选择NSManagedObject subclass,然后点击Next按钮将会出现选择实体窗口(这里不一定,也可能不出现,如果不出现,就要看生成的新文件是关联那个实体的,如果实体比较多,应该会出现,不出现就一个实体一个实体的建立),选择上之后再点击Next出现保存界面,保存既可以。在项目中将出现ArInfo.h和ArInfo.m这两个文件。


6.然后在LWTAViewController.h的@interface与@end中加入

@property (strong,nonatomic)NSManagedObjectContext *context;

在LWTAViewController.m中的@implementation之后加@synthesize context;

并在LWTAViewController.m添加

#import "ArInfo.h"

#import "LWTAppDelegate.h"

这两个头文件。然后在ViewDidLoad中加入如下代码:

LWTAppDelegate *delegate = (LWTAppDelegate *)[[UIApplication sharedApplication]delegate];//这里需要引进自己项目的委托,是让全局managedObjectContext起作用。

    self.context = delegate.managedObjectContext;

    ArInfo *arInfo = [NSEntityDescriptioninsertNewObjectForEntityForName:@"ArInfo"inManagedObjectContext:context];

    arInfo.myid=@"123";

    arInfo.myname=@"object-c";

    NSError *error = nil;

    if (![contextsave:&error]) {

        NSLog(@"%@",[errorlocalizedDescription]);

    }

   

    NSFetchRequest *fetchRequest = [[NSFetchRequestalloc]init];

    NSEntityDescription *entity = [NSEntityDescriptionentityForName:@"ArInfo"inManagedObjectContext:context];

    [fetchRequest setEntity:entity];

  

    NSArray *fetchObject = [contextexecuteFetchRequest:fetchRequesterror:&error];

    for (NSManagedObject *infoin fetchObject) {

        NSLog(@"id:%@",[infovalueForKey:@"myid"]);

        NSLog(@"name:%@",[infovalueForKey:@"myname"]);

}

这时运行程序。在All OutPut将输出:

2012-11-21 14:12:25.027 iWeather[2750:11603] id:123

2012-11-21 14:12:25.028 iWeather[2750:11603] name:object-c

代码:http://pan.baidu.com/share/link?shareid=125190&uk=1277579135


阅读更多
换一批

没有更多推荐了,返回首页