我想要写一个“管理”的游戏,利用核心数据严重。 游戏需要一个预先设定的,预先定义的数据集不能由用户/系统被改变; 它被用于接种与数据的游戏,其目的是为只读。
我能给出的最好的例子是足球管理游戏,但它可以是任何东西。 在一些足球管理模拟游戏,他们给你的场景和预先设定的数据集。
随着用户继续通过游戏它们可以保存/加载的被保存到核心数据他们的进展。
除了这一点,用户可以接收更新到预先定义的数据或者可以购买数据的场景包; 其保存到他们的设备。
因此,可能有多个“核心数据的数据库”(是的,我知道核心数据并不是严格意义上的数据库)或“桶”,它的应用可以潜入并使用。
数据的模式不会改变。
因此,我们有:
- 其仅用于播种游戏预定义的数据(默认数据)。
- 用户当前保存游戏。
- 用户从互联网上下载的情况。
- 问题:当用户保存游戏,而在“方案”会发生什么。
- 问题:我如何跟踪所有的场景和所有的核心数据,用户保存的游戏吗?
这听起来像是在给定时间多个数据库。 Obviousily应该限制多少游戏存档,用户可以做到的。
另一种解决方案是,用户的设备出口数据的备份副本的JSON或XML,这作为“保存数据”,我可以用这个策略的情况了。 Obviousily将需要某种形式的加密,以防止有人简单地通过XML改变统计数据在游戏中。
但我从一开始就什么是使用的核心数据,iOS设备的处理比1的核心数据“数据库”更多的最佳途径知道?
谢谢你的时间
如果数据模型是一样的,你可以设置你的MOC,以便它使用的持久存储......其中一个是只读和读/写其他。
或者,您可以使用单独的MOC每个商店。
那么,要如何使用它是你唯一的决定因素,因为你可以有MOC / PSC的几乎任意组合。
请查看文档在这里获取更多信息。
编辑 :
这个问题给出的链接是死的,别人认为这个链接在另一个删除答案。
注:这是一个老问题,但它描述的问题是永恒的,所以我写了答案,就好像今天的问题被张贴。
其实,这一切都不提出了多个数据库的需要。 因此,我们有:
1)仅用于接种游戏的预定义数据(默认数据)。
编写将数据加载到持久化存储(数据库)的方法。 在设置用户默认,defaultDataHasBeenLoaded或类似的东西的标志,并检查在appDelegata。
2)用户的当前保存游戏。
你需要一个用户表和游戏表一到一对多的关系。 在游戏表添加一个isCurrentGame属性。
3)用户已经从互联网上下载的情况。
现在,它变得有趣。 您将需要为进口函数或类,你会想在后台线程上运行。 通过这种方式,用户可以继续玩,或寻找看着自己的分数或什么的,而新的方案正在导入。 当场景被导入,用户应该得到通知,并切换到新方案的机会。
最有效的方式做到这一点是使用NSPeristentContainer它可以从iOS的10.0,MacOS的10.12,tvOS 10.0和3.0 watchOS。 给NSPeristentContainer数据模型的名称,它会创建或加载持久存储,并设置persistentStoreCoördinator和managedObjectContext。
// AppDelegate.h or class header file
@property (readonly, strong, nonatomic) NSPersistentContainer *persistentContainer;
@property (readonly, weak, nonatomic) NSManagedObjectContext *managedObjectContext;
// AppDelegate.m or other implementation file
@synthesize persistentContainer = _ persistentContainer;
@synthesize managedObjectContext = _ managedObjectContext;
- (NSPersistentContainer *)persistentContainer
{
@synchronized (self) {
if (_persistentContainer == nil) {
_persistentContainer = [[NSPersistentContainer alloc] initWithName:@"nameOfDataModel"];
[_persistentContainer loadPersistentStoresWithCompletionHandler:^(NSPersistentStoreDescription *storeDescription, NSError *error) {
if (error != nil) {
// Handle the error
} else {
_managedObjectContext = _persistentContainer.viewContext; // NB new name for moc is viewContext!
}
}];
}
}
return _persistentContainer;
}
使用来自的appDelegate的容器在NSViewController,您可以添加以下到viewDidLoad中:
self.representedObject = [(AppDelegate *)[[NSApplication sharedApplication] delegate] persistentContainer];
// Use representedObject in bindings, such as:
[_gameNameTextField bind:NSValueBinding toObject:self
withKeyPath:@"representedObject.game.name"
options:options];
要导入新的场景,使用performBackgroundTask :,它会自动创建一个新的线程和新managedObjectContext(这里称为moc_background)块。 仅使用moc_background任何你在做块-如果调用外块的方法,通过它moc_background。
NSPersistentContainer *pc = (NSPersistentContainer *)self.representedObject;
pc.viewContext.automaticallyMergesChangesFromParent = YES; // this will ensure the main context will updated automatically
__block id newScenario;
[pc performBackgroundTask:^(NSManagedObjectContext * _Nonnull moc_background) {
NSEntityDescription *scenarioDesc = [NSEntityDescription entityForName:@"Scenario" inManagedObjectContext:moc_background];
NSManagedObject *scenario = [[NSManagedObject alloc] initWithEntity:scenarioDesc insertIntoManagedObjectContext:moc_background];
// configure scenario with the data from newScenario
NSError *error;
BOOL saved = [moc_background save:&error];
// send out a notification to let the rest of the app know whether the import was successfull
}];
问题:当用户保存游戏,而在“方案”会发生什么。
这取决于谁第一个到达那里,后台线程试图合并或保存操作。 如果添加了场景表,多到一个关系到游戏桌,不应该有任何问题。
问题:我如何跟踪所有的场景和所有的核心数据,用户保存的游戏吗?
数据建模可能会非常棘手。 保持简单,首先,当你发现他们显然需要增加表和关系。 然后进行测试,测试,再测试。