zoukankan      html  css  js  c++  java
  • iOS: Core Data入门

    Core Data是ORM框架,很像.NET框架中的EntityFramework。使用的基本步骤是:

    • 在项目属性里引入CoreData.framework (标准库)
    • 在项目中新建DataModel (生成*.xcdatamodeld文件)
    • 在DataModel里创建Entity 
    • 为Entity生成头文件(菜单Editor/Create NSMangedObject Subclass...)
    • 在项目唯一的委托类(AppDelegate.h, AppDelegate.m)里添加managedObjectContext 用来操作Core Data
    • 代码任意位置引用 managedObjectContext 读写数据

    模型:(注意:myChapter, myContent这些关系都是Cascade,这样删父对象时才会删除子对象)

    生成的头文件:

    /* Book.h */
    @interface Book : NSManagedObject
    
    @property (nonatomic, retain) NSNumber * bookId;
    @property (nonatomic, retain) NSString * name;
    @property (nonatomic, retain) NSString * author;
    @property (nonatomic, retain) NSString * summary;
    @property (nonatomic, retain) NSSet *myChapters;
    @end
    
    @interface Book (CoreDataGeneratedAccessors)
    
    - (void)addMyChaptersObject:(NSManagedObject *)value;
    - (void)removeMyChaptersObject:(NSManagedObject *)value;
    - (void)addMyChapters:(NSSet *)values;
    - (void)removeMyChapters:(NSSet *)values;
    
    @end
    
    /* Chapter.h */
    @class Book;
    @interface Chapter : NSManagedObject
    
    @property (nonatomic, retain) NSNumber * chapId;
    @property (nonatomic, retain) NSString * name;
    @property (nonatomic, retain) NSNumber * orderId;
    @property (nonatomic, retain) Book *ownerBook;
    @property (nonatomic, retain) NSManagedObject *myContent;
    
    @end
    
    /* TextContent.h */
    @class Chapter;
    
    @interface TextContent : NSManagedObject
    
    @property (nonatomic, retain) NSNumber * chapId;
    @property (nonatomic, retain) NSString * text;
    @property (nonatomic, retain) Chapter *ownerChapter;
    
    @end

    委托类代码


    AppDelegate.h

    // AppDelegate.h
    
    #import <UIKit/UIKit.h>
    #import <CoreData/CoreData.h>
    
    #import "Book.h"
    #import "Chapter.h"
    #import "TextContent.h"
    
    @interface AppDelegate : UIResponder <UIApplicationDelegate>
    
    @property (strong, nonatomic) UIWindow *window;
    @property (strong, nonatomic) NSManagedObjectContext *managedObjectContext;
    
    @end

    AppDelegate.m

    @implementation AppDelegate
    @synthesize managedObjectContext = _managedObjectContext;
    
    -(NSManagedObjectContext *)managedObjectContext
    {
        if (_managedObjectContext != nil) {
            return _managedObjectContext;
        }
        
        _managedObjectContext = [[NSManagedObjectContext alloc]init];
        
        // 设置数据库路径
        NSURL *url = [[[NSFileManager defaultManager]
                       URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask]lastObject];
        NSURL *storeDataBaseURL = [url URLByAppendingPathComponent:@"BOOKS.sqlite"];
        
        // 创建presistentStoreCoordinator
        NSError *error = nil;
        NSPersistentStoreCoordinator *presistentStoreCoordinator  = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[NSManagedObjectModel mergedModelFromBundles: nil]];
        
        // 指定存储类型和路径
        if (![presistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType
                    configuration:nil URL:storeDataBaseURL options:nil error:&error]) {
            NSLog(@"error : %@", error);
        }
        
        [_managedObjectContext setPersistentStoreCoordinator: presistentStoreCoordinator];
        return _managedObjectContext;
    }

    使用_managedObjectContext操作Core Data

    // 保存新对象
    -(void) testStore
    {
        // 从AppDelegate 获得context
        AppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
        NSManagedObjectContext *context = [appDelegate managedObjectContext];
    
        // 第一个章节
        TextContent *content1 = [NSEntityDescription insertNewObjectForEntityForName:@"TextContent" inManagedObjectContext:context];
        content1.chapId = [NSNumber numberWithInt:100];
        content1.text = @"hello1";
        
        Chapter *chapter1 = (Chapter *)[NSEntityDescription insertNewObjectForEntityForName:@"Chapter" inManagedObjectContext:context];
        chapter1.name = @"hello1";
        chapter1.orderId = [NSNumber numberWithInt:0];
        chapter1.chapId =  [NSNumber numberWithInt:100];
        chapter1.myContent = content1;
        
        // 第二个章节
        TextContent *content2 = [NSEntityDescription insertNewObjectForEntityForName:@"TextContent" inManagedObjectContext:context];
        content2.chapId = [NSNumber numberWithInt:100];
        content2.text = @"hello2";
        
        Chapter *chapter2 = (Chapter *)[NSEntityDescription insertNewObjectForEntityForName:@"Chapter" inManagedObjectContext:context];
        chapter2.name = @"hello2";
        chapter2.orderId = [NSNumber numberWithInt:1];
        chapter2.chapId =  [NSNumber numberWithInt:101];
        chapter2.myContent = content2;
        
        // 书籍对象
        Book *book = (Book *)[NSEntityDescription insertNewObjectForEntityForName:@"Book" inManagedObjectContext:context];
        book.bookId = [NSNumber numberWithInt:100];
        book.name = @"hello";
        book.author = @"Kitty";
        book.summary = @"test";
        [book addMyChaptersObject:chapter1];
        [book addMyChaptersObject:chapter2];
        
        // 提交到持久存储
        if ([context hasChanges]) {
            [context save:nil];
        }
    }
    
    // 读取对象
    -(void) testRead
    {
        // 从AppDelegate 获得context
        AppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
        NSManagedObjectContext *context = [appDelegate managedObjectContext];
        
        // 生成查询对象 (查询全部数据)
        NSEntityDescription *entityDescr = [NSEntityDescription entityForName:@"Book" inManagedObjectContext:context];
        NSFetchRequest *request = [[NSFetchRequest alloc]init];
        [request setEntity:entityDescr];
        
        // 执行查询
        NSError *error;
        NSArray *arrayBooks = [context executeFetchRequest:request error:&error];
    
        // 定义排序方式 (根据集合中Chapter对象的orderId属性排序,升序)
        NSSortDescriptor *chaptersDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"orderId" ascending:YES];
        
        // 遍历结果集
        for (Book *book in arrayBooks) {
            
            // 使用当前对象属性
            NSLog(@"book name = %@", book.name);
            
            // 使用当前对象的集合属性,转成数组
            NSArray *arrayChapters = [book.myChapters allObjects];
            
            // 排序
            arrayChapters = [arrayChapters
                              sortedArrayUsingDescriptors:[NSArray arrayWithObjects:chaptersDescriptor,nil]];
            
            // 遍历子数组
            for (Chapter *chapter in arrayChapters) {
                NSLog(@"chapter name = %@", chapter.name);
                
                TextContent *content = (TextContent*) chapter.myContent;
                NSLog(@"chapter text = %@", content.text);
            }
        }
    }
    
    // 更新对象属性
    -(void) testUpdate
    {
        // 从AppDelegate 获得context
        AppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
        NSManagedObjectContext *context = [appDelegate managedObjectContext];
        
        // 生成Request对象
        NSEntityDescription *entityDescr = [NSEntityDescription entityForName:@"Book" inManagedObjectContext:context];
        NSFetchRequest *request = [[NSFetchRequest alloc]init];
        [request setEntity:entityDescr];
        
        // 执行查询
        NSError *error;
        NSArray *array = [context executeFetchRequest:request error:&error];
        
        // 更改对象属性
        Book * book = array[0];
        book.name = @"BOOKS";
        
        // 提交到持久存储
        if ([context hasChanges]) {
            [context save:nil];
        }
    }
    
    // 删除对象
    -(void) testRemove
    {
        // 从AppDelegate 获得context
        AppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
        NSManagedObjectContext *context = [appDelegate managedObjectContext];
        
        // 生成Request对象
        NSEntityDescription *entityDescr = [NSEntityDescription entityForName:@"Book" inManagedObjectContext:context];
        NSFetchRequest *request = [[NSFetchRequest alloc]init];
        [request setEntity:entityDescr];
        
        // 执行查询
        NSError *error;
        NSArray *array = [context executeFetchRequest:request error:&error];
        
        // 遍历删除对象,因为在模型里把关系设置为Cascade,所以子对象会被自动删除
        for (Book *book in array) {
            [context deleteObject:book];
        }
        
        // 提交到持久存储
        if ([context hasChanges]) {
            [context save:nil];
        }
    }
  • 相关阅读:
    matlab cell
    matlab linux 快捷键设置——有问题还是要解决
    latex 小结
    TOJ 1258 Very Simple Counting
    TOJ 2888 Pearls
    HDU 1248 寒冰王座
    TOJ 3486 Divisibility
    TOJ 3635 过山车
    TOJ 1840 Jack Straws
    HDU 4460 Friend Chains
  • 原文地址:https://www.cnblogs.com/code-style/p/4016390.html
Copyright © 2011-2022 走看看