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];
        }
    }
  • 相关阅读:
    我终于会手打lct了!
    [模板]Dijkstra-优先队列优化-单源最短路
    99999999海岛帝国后传:算法大会
    正在加载中。。。。。
    【题解】CF1054D Changing Array(异或,贪心)
    【题解】P4550 收集邮票(概率期望,平方期望)
    【题解】CF149D Coloring Brackets(区间 DP,记忆化搜索)
    【笔记】斜率优化 DP
    CSP2021 游记
    【题解】洛谷P1502 窗口的星星
  • 原文地址:https://www.cnblogs.com/code-style/p/4016390.html
Copyright © 2011-2022 走看看