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]; } }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。