IOS CoreData (1)

  IOS 开发中经常会用CoreData,CoreData实际上使用的是SQLLite。今天开始看了看CoreData的基本使用,记录一下学习过程与体会。

  在CoreData中有几个概念要清楚Model,Entity,,Attribute,Relationship。可以简单的用关系数据库的概念来解释:model为database,Entity对应一张表,Attribute为表中的字段,relationship为关系。

  明白概念以后来看看使用CoreData的具体步骤:

  1,在项目中新建一个模型文件(Data Model),新建后项目里面会有一个*.xcdatamodeld文件生成。

  2,根据需求在模型中添加Entity,也就是我们理解的表。同时为Entity定义相应的Attribute。

  3,确立Entity之间的关系,支持一对一和一对多关系

  4,为每个Entity添加对应的NSManagedObject子类,实现数据存取操作

 

  前3步都可以在可视化额界面下完成,第4需要自己写代码去实现。

  

  在写代码之前需要了解CoreData里面几个重要对象:

  NSManagedObject:通过CoreData取回的对象默认都是NSManagedObject,所以使用Core Data的Entity类都是继承自NSManagedObject。(可以在Model中新建Entity后由在xcode中新建NSManagedObject subclass由xcode自动生成对应子类)

  NSManagedObjectContext:负责应用和数据库之间的工作

  NSPersistantStoreCoordinator:可以指定文件并打开相应的SQLLite数据库。

  NSFetchRequest:用来获取数据

  NSEntityDesciption:代表Entity 对应的类

   有了这些类基本就可以开始写自己的的代码了:

 初始化需要用到的类实例:

- (id)init
{
    self=[super init];
    
    if(self != nil)
    {
        //读取model文件
        model = [NSManagedObjectModel mergedModelFromBundles:nil];
        
        NSPersistentStoreCoordinator *psc = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:model];
        
        //设置SQLLite path
        NSString *path = [self noteArchivePath];
        NSURL *storeURL = [NSURL fileURLWithPath:path];
        
        NSError *error = nil;
        
        if([psc addPersistentStoreWithType:NSSQLiteStoreType
                             configuration:nil
                                       URL:storeURL
                                   options:nil
                                     error:&error] == nil
           )
        {
            [NSException raise:@"Open failed" format:@"Reason: %@",[error localizedDescription]];
        }
        
        //创建NSManagedObjectContext对象
        context = [[NSManagedObjectContext alloc] init];
        [context setPersistentStoreCoordinator:psc];
        
        [context setUndoManager:nil];
    }
    return self ;
}

利用NSFetchRequest获取数据库中的数据:

- (NSUInteger)loadAllNotes
{
    if(!allNotes)
    {
        NSFetchRequest *request = [[NSFetchRequest alloc] init];
        NSEntityDescription *e = [[model entitiesByName] objectForKey:@"NoteItem"] ;
        [request setEntity:e];
        
        NSError *error=nil;
        
        NSArray *result = [context executeFetchRequest:request error:&error] ;
        
        if(result == nil)
        {
            [NSException raise:@"Fetch failed" format:@"Reason: %@",[error localizedDescription]];
        }
        
        allNotes = [[NSMutableArray alloc] initWithArray:result];
    }
    
        return allNotes.count;
    
}

对应Entity的类只能通过context来创建:

- (NoteItem *)createNoteItem
{
    NoteItem *note = [NSEntityDescription insertNewObjectForEntityForName:@"NoteItem" inManagedObjectContext:context];
    [allNotes addObject:note];
    return note ;
}

 

将数据保存到数据库中只要调用context中的对应方法就可以了:

- (BOOL)saveChanges
{
    NSError *error = nil ;
    
    BOOL successful = [context save:&error];
    
    if(!successful)
    {
        NSLog(@"Error saving %@",[error localizedDescription]);
    }
    
    return successful;
}

删除:

- (void)removeNoteItem:(NoteItem *)note
{
    [context deleteObject:(NSManagedObject *)note];
    [allNotes removeObject:note];
    
}

这些我写一个小dome时候的代码,理解了上述用到的一些类就可以进行基本的存取操作了。

学习笔记,可能存在错误,仅供参考,欢迎指正。

 

posted @ 2013-07-26 16:32  nirvawolf  阅读(3380)  评论(0编辑  收藏  举报