《iOS 开发》CoreData

  • 创建数据模型:
    首先在 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 开发中最基本和常见的使用场景。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容