美文网首页代码人生
iOS基础教程:在建好的项目中加入CoreData

iOS基础教程:在建好的项目中加入CoreData

作者: 赵yx | 来源:发表于2015-12-29 09:57 被阅读172次

    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。

    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(管理数据内容):你可以将这一部分看作是数据的实际内容,这也是整个数据库中对我们而言最重要的部分(这还用说),基本上,插入数据,查询数据,删除数据的工作都在这里完成。

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

    @synthesizemanagedObjectContext =_managedObjectContext;

    @synthesizemanagedObjectModel = _managedObjectModel;

    @synthesizepersistentStoreCoordinator = _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之后加@synthesizecontext;

    并在LWTAViewController.m添加

    #import"ArInfo.h"

    #import"LWTAppDelegate.h"

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

    LWTAppDelegate*delegate = (LWTAppDelegate*)[[UIApplicationsharedApplication]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];

    [fetchRequestsetEntity:entity];

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

    for(NSManagedObject*infoinfetchObject) {

    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

    相关文章

      网友评论

        本文标题: iOS基础教程:在建好的项目中加入CoreData

        本文链接:https://www.haomeiwen.com/subject/dbfihttx.html