首页 > 代码库 > iOS: Core Data入门
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]; }}
iOS: Core Data入门
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。