是否有可能有一个iOS应用多核心数据“数据库”?(Is it possible to have mu

2019-07-02 19:33发布

我想要写一个“管理”的游戏,利用核心数据严重。 游戏需要一个预先设定的,预先定义的数据集不能由用户/系统被改变; 它被用于接种与数据的游戏,其目的是为只读。

我能给出的最好的例子是足球管理游戏,但它可以是任何东西。 在一些足球管理模拟游戏,他们给你的场景和预先设定的数据集。

随着用户继续通过游戏它们可以保存/加载的被保存到核心数据他们的进展。

除了这一点,用户可以接收更新到预先定义的数据或者可以购买数据的场景包; 其保存到他们的设备。

因此,可能有多个“核心数据的数据库”(是的,我知道核心数据并不是严格意义上的数据库)或“桶”,它的应用可以潜入并使用。

数据的模式不会改变。

因此,我们有:

  1. 其仅用于播种游戏预定义的数据(默认数据)。
  2. 用户当前保存游戏。
  3. 用户从互联网上下载的情况。
  4. 问题:当用户保存游戏,而在“方案”会发生什么。
  5. 问题:我如何跟踪所有的场景和所有的核心数据,用户保存的游戏吗?

这听起来像是在给定时间多个数据库。 Obviousily应该限制多少游戏存档,用户可以做到的。

另一种解决方案是,用户的设备出口数据的备份副本的JSON或XML,这作为“保存数据”,我可以用这个策略的情况了。 Obviousily将需要某种形式的加密,以防止有人简单地通过XML改变统计数据在游戏中。

但我从一开始就什么是使用的核心数据,iOS设备的处理比1的核心数据“数据库”更多的最佳途径知道?

谢谢你的时间

Answer 1:

如果数据模型是一样的,你可以设置你的MOC,以便它使用的持久存储......其中一个是只读和读/写其他。

或者,您可以使用单独的MOC每个商店。

那么,要如何使用它是你唯一的决定因素,因为你可以有MOC / PSC的几乎任意组合。

请查看文档在这里获取更多信息。


编辑

这个问题给出的链接是死的,别人认为这个链接在另一个删除答案。



Answer 2:

注:这是一个老问题,但它描述的问题是永恒的,所以我写了答案,就好像今天的问题被张贴。

其实,这一切都不提出了多个数据库的需要。 因此,我们有:

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
    }];

问题:当用户保存游戏,而在“方案”会发生什么。

这取决于谁第一个到达那里,后台线程试图合并或保存操作。 如果添加了场景表,多到一个关系到游戏桌,不应该有任何问题。

问题:我如何跟踪所有的场景和所有的核心数据,用户保存的游戏吗?

数据建模可能会非常棘手。 保持简单,首先,当你发现他们显然需要增加表和关系。 然后进行测试,测试,再测试。



文章来源: Is it possible to have multiple core data “databases” on one iOS app?