在 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 和 React Native
如何使用 Objective C iOS 从 iPhone X 中的表格视图顶部删除多余的空间
在 Google Maps SDK for native iOS/objective C 中的 InfoWindow/Marker 上添加 Click 事件