在 Objective C 中的 iOS 应用程序中使用核心数据作为数据库的步骤

Posted

技术标签:

【中文标题】在 Objective C 中的 iOS 应用程序中使用核心数据作为数据库的步骤【英文标题】:steps for use core data as database in my iOS app in Objective C 【发布时间】:2015-08-22 07:07:32 【问题描述】:

谁能描述我的核心数据? 我想创建存储日活动记录和存储在本地文件中的数据的工作表。 我认为核心数据最好存储在本地。 提前致谢。

【问题讨论】:

您应该花时间在谷歌上搜索核心数据编程指南或教程,而不是询问有关 SO 的步骤。这不是询问和接收教程的地方。网络上有数百种有关 Core Data 的材料。 【参考方案1】:

您不应将 CoreData 视为数据库,而是将其视为管理对象图的一种方式。

然后您可以将此图存储在不同的地方(从应用程序的角度来看是透明的),例如内存、XML、sqlite,我认为是自定义二进制文件。

您通常做的是在核心数据模型中编写模型。

每个对象要么是NSManagedObject 的一个实例(您可以使用valueForKey:setValueForKey: 等方法查询/使用它)或该类的子类。这些子类可以直接从 Xcode 自动生成,此时您几乎忘记了您正在使用 CoreData。每个属性都是@property,每个多对多关系都是NSSet。 当您创建并想要保存对象时,您会回到使用 CoreData 的事实。在这种情况下,您必须获取对象所在的“上下文”,并在其上调用方法(例如save

网络上有很多关于 CoreData 的教程和文档。 在我看来,核心点是......不要将其视为关系数据库。 “更加面向对象”:)

要开始使用,您可以查看:

http://www.raywenderlich.com/934/core-data-tutorial-for-ios-getting-started

对于更复杂的东西,苹果文档是可以的 https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/CoreData/cdProgrammingGuide.html#//apple_ref/doc/uid/TP30001200-SW1

【讨论】:

raywenderlich.com/934/… 对核心数据初学者很有帮助。【参考方案2】:

是的,你是对的,Core data 是在 iOS 应用程序中存储数据的最佳方式。

有了新的XCode,您只需在创建新项目时单击您将使用 coreData 的复选框。

这将在您的AppDelegate 文件中创建yourPorject.xcdatamodeld 文件和一些方法:

 - (NSURL *)applicationDocumentsDirectory 
// The directory the application uses to store the Core Data store file. This code uses a directory named "result.PingPong" in the application's documents directory.
    return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
 

 - (NSManagedObjectModel *)managedObjectModel 
// The managed object model for the application. It is a fatal error for the application not to be able to find and load its model.
    if (_managedObjectModel != nil) 
        return _managedObjectModel;
    
    NSURL *modelURL = [[NSBundle mainBundle] URLForResource:@"PingPong" withExtension:@"momd"];
    _managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelURL];
    return _managedObjectModel;
 

 - (NSPersistentStoreCoordinator *)persistentStoreCoordinator 
     // The persistent store coordinator for the application. This implementation creates and return a coordinator, having added the store for the application to it.
     if (_persistentStoreCoordinator != nil) 
        return _persistentStoreCoordinator;
    

   // Create the coordinator and store

    _persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
    NSURL *storeURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"PingPong.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]) 
        // Report any error we got.
        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];
        // Replace this with code to handle the error appropriately.
        // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        abort();
    

    return _persistentStoreCoordinator;
 


 - (NSManagedObjectContext *)managedObjectContext 
    // Returns the managed object context for the application (which is already bound to the persistent store coordinator for the application.)
    if (_managedObjectContext != nil) 
     return _managedObjectContext;
    

    NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
    if (!coordinator) 
        return nil;
    
    _managedObjectContext = [[NSManagedObjectContext alloc] init];
    [_managedObjectContext setPersistentStoreCoordinator:coordinator];
    return _managedObjectContext;
 

 #pragma mark - Core Data Saving support

 - (void)saveContext 
    NSManagedObjectContext *managedObjectContext = self.managedObjectContext;
    if (managedObjectContext != nil) 
        NSError *error = nil;
        if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) 
            // Replace this implementation with code to handle the error appropriately.
            // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
            NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
            abort();
        
    
 

(我认为它没有)

之后,您在yourPorject.xcdatamodeld 中创建实体对象,单击AddEntity,为其命名,并在Add Attribute 中添加您的所有属性。

之后点击菜单:Editor -> Create NSManagedObject subclasses。这将自动为您创建对象。

将对象保存到数据库中所需要做的就是

AppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
NSManagedObjectContext *context = appDelegate.managedObjectContext;

YourObject * o = [NSEntityDescription insertNewObjectForEntityForName:@"YourObject" inManagedObjectContext:context];
o.attribute1 = attribute1;
o.attribute2 = attribute2;

[context save:nil];

要获取所有对象,您将需要这个:

AppDelegate *appDelegate = [UIApplication sharedApplication].delegate;
NSManagedObjectContext *context = appDelegate.managedObjectContext;
NSError *fetchError;

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"YourObject" inManagedObjectContext:context];
[fetchRequest setEntity:entity];
NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&fetchError];
if (fetchError != nil) 
    NSLog(@"Error fetching database request. Reason: %@", fetchError);

希望对你有帮助。

马尔科

【讨论】:

使用这个我了解核心数据代码的流程。

以上是关于在 Objective C 中的 iOS 应用程序中使用核心数据作为数据库的步骤的主要内容,如果未能解决你的问题,请参考以下文章

如何在应用程序委托iOS10 Objective C中的applicationWillEnterForeground方法中以模态方式呈现UIViewController

IOS项目目标中的多个Objective C桥接头

从 iOS 中的共享按钮启动应用程序 - Objective C 和 React Native

如何使用 Objective C iOS 从 iPhone X 中的表格视图顶部删除多余的空间

在 Google Maps SDK for native iOS/objective C 中的 InfoWindow/Marker 上添加 Click 事件

Objective-C依然占C位,Swift和SwiftUI在iOS 15中的使用情况