- 创建数据模型:
首先在 Xcode 中创建一个新的 Core Data 数据模型文件(.xcdatamodeld),并在其中定义实体和属性。这里假设我们定义了一个名为 Person 的实体,包含 name(字符串类型)和 age(整数类型)属性。 - 配置 Core Data Stack:
在应用中设置 Core Data 的栈,包括 NSManagedObjectModel、NSPersistentStoreCoordinator 和 NSManagedObjectContext。
#import "AppDelegate.h"
#import <CoreData/CoreData.h>
@interface AppDelegate ()
@property (readonly, strong) NSManagedObjectModel *managedObjectModel;
@property (readonly, strong) NSPersistentStoreCoordinator *persistentStoreCoordinator;
@property (readonly, strong) NSManagedObjectContext *managedObjectContext;
@end
@implementation AppDelegate
- (NSManagedObjectModel *)managedObjectModel {
NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"YourDataModelName" withExtension:@"momd"];
return [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
}
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (_persistentStoreCoordinator != nil) {
return _persistentStoreCoordinator;
}
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"YourAppName.sqlite"];
NSError *error = nil;
NSString *failureReason = @"There was an error creating or loading the application's saved data.";
if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeURL options:nil error:&error]) {
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
dict[NSLocalizedDescriptionKey] = @"Failed to initialize the application's saved data";
dict[NSLocalizedFailureReasonErrorKey] = failureReason;
dict[NSUnderlyingErrorKey] = error;
error = [NSError errorWithDomain:@"YOUR_ERROR_DOMAIN" code:9999 userInfo:dict];
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
return _persistentStoreCoordinator;
}
- (NSManagedObjectContext *)managedObjectContext {
if (_managedObjectContext != nil) {
return _managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (!coordinator) {
return nil;
}
_managedObjectContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSMainQueueConcurrencyType];
[_managedObjectContext setPersistentStoreCoordinator:coordinator];
return _managedObjectContext;
}
- (NSURL *)applicationDocumentsDirectory {
return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}
@end
- 插入数据
- (void)insertData {
NSManagedObjectContext *context = self.managedObjectContext;
NSManagedObject *newPerson = [NSEntityDescription insertNewObjectForEntityForName:@"Person" inManagedObjectContext:context];
[newPerson setValue:@"John Doe" forKey:@"name"];
[newPerson setValue:@30 forKey:@"age"];
NSError *error = nil;
if (![context save:&error]) {
NSLog(@"Could not save. %@, %@", error, [error userInfo]);
}
}
- 查询数据:
- (void)fetchData {
NSManagedObjectContext *context = self.managedObjectContext;
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Person"];
NSError *error = nil;
NSArray *people = [context executeFetchRequest:fetchRequest error:&error];
if (people) {
for (NSManagedObject *person in people) {
NSString *name = [person valueForKey:@"name"];
NSNumber *age = [person valueForKey:@"age"];
NSLog(@"Name: %@, Age: %@", name, age);
}
} else {
NSLog(@"Could not fetch data. %@, %@", error, [error userInfo]);
}
}
- 删除数据:
- (void)deleteData {
NSManagedObjectContext *context = self.managedObjectContext;
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Person"];
NSError *error = nil;
NSArray *people = [context executeFetchRequest:fetchRequest error:&error];
if (people) {
for (NSManagedObject *person in people) {
[context deleteObject:person];
}
if (![context save:&error]) {
NSLog(@"Could not save after deletion. %@, %@", error, [error userInfo]);
}
} else {
NSLog(@"Could not fetch data for deletion. %@, %@", error, [error userInfo]);
}
}
在上述代码中,YourDataModelName 应替换为实际的数据模型文件名,YourAppName 应替换为应用的名称。同时,在 AppDelegate 中定义的 Core Data 栈相关方法可以根据需要进行调整和优化。这些操作展示了 Core Data 在 iOS 开发中最基本和常见的使用场景。