【问题标题】:Using Core Data created in one project as input to another project使用在一个项目中创建的 Core Data 作为另一个项目的输入
【发布时间】:2014-11-21 22:10:10
【问题描述】:

我发现了几个与此类似的问题,但没有一个完全符合我的需求。我在 Swift 中开发了一个简单的数字化应用程序,它呈现图像并允许我使用模拟器对图像中的特定点进行数字化。

我使用 Core Data 来保存数据。一个实体(“Coursemap”)具有图像属性(二进制数据)和一些元数据(字符串)。 Coursemap 实体与“Points”实体具有一对多的关系。 Points 实体定义图像中特定点的 x/y 坐标的属性。数字化仪应用程序运行良好;我可以使用 Core Data 数字化和保存多个图像。在我的应用程序的最终版本中,我可能需要大约 50-60 个数字化图像。

我想做的是使用来自我的数字化仪应用程序输出的数据作为我正在开发的 iPad 游戏的输入。所以我基本上想将在我的数字化仪项目中创建的核心数据文件复制到我的游戏项目中,以便我的游戏应用程序可以使用数字化图像。有没有办法做到这一点? Core Data 是处理这个问题的最佳方式吗?

到目前为止我所做的尝试:我将两个项目命名相同,但将它们保存在不同的文件夹中,例如:
~/digitizer/myApp and ~/games/myApp.

在文件夹中创建数字化仪核心数据文件:
~/Library/Developer/CoreSimulator/Devices/…/Documents.

当我运行游戏应用程序时,似乎希望 Core Data 文件位于同一目录中(这就是我将两个项目命名为相同的原因)。当游戏应用程序尝试获取数据时,我收到错误消息“用于打开商店的模型与用于创建商店的模型不兼容”。我已经仔细检查了数据模型,它们是相同的。

对此有什么想法吗?谢谢。

【问题讨论】:

  • 你确定这些型号是一样的吗?尝试将 xcdatamodeld 文件从一个项目复制到另一个项目。
  • 谢谢,@pbasdf。我会在今天晚些时候试一试,然后再报告。
  • @pbasdf 将 xcdatamodeld 文件从一个项目复制到另一个不起作用(当我在项目导航器中单击 app.xcdatamodeld 文件时,什么都不会出现。然后我重新开始并重新创建我的(非数字化仪)应用程序包括非常仔细地创建数据模型,现在一切正常。我可以运行数字化仪应用程序来创建数据,然后使用之前创建的数据作为输入运行我的游戏应用程序。肯定有什么数据模型之间的差异。感谢您的帮助!
  • 对不起,应该说使用 Finder 而不是 Xcode Project Navigator 来复制文件。但很高兴你把它整理好了。

标签: ios core-data swift


【解决方案1】:

我意识到类似的事情: - 从模拟器文件夹中选择你预填充的 sqlite 文件 - 将其复制到您的其他项目 - 在运行时,检查你的其他项目是否存在一个 sqlite 结构,如果它没有通过将 sqlite 文件从你的包复制到文档文件夹来创建它:

if(![[NSFileManager defaultManager]fileExistsAtPath:coreDataDatabase.path])
        {
            url = coreDataDatabase;
            [[NSFileManager defaultManager] createDirectoryAtURL:url withIntermediateDirectories:YES attributes:nil error:NULL];

            url = [url URLByAppendingPathComponent:@"StoreContent"];
            [[NSFileManager defaultManager] createDirectoryAtURL:url withIntermediateDirectories:YES attributes:nil error:NULL];

            url = [url URLByAppendingPathComponent:@"persistentStore"];

            // copy the sqlite file to /Documents/<YourApp>/StoreContent/persistentStore
            NSArray *stringParts = [kCoreDataPreloadedDatabase componentsSeparatedByString:@"."];
            NSString *sqlitePath = [[NSBundle mainBundle]
                                    pathForResource:[stringParts objectAtIndex:0] ofType:@"sqlite"];
            NSError *anyError = nil;
            BOOL success = [[NSFileManager defaultManager]
                            copyItemAtPath:sqlitePath toPath:[url path] error:&anyError];
            if(!success)
            {
                Error(@"Unable to copy sqlite file: %@", anyError);
            }
        }

【讨论】:

  • Eike - 请查看我对原始帖子的评论。我的两个数据模型之间显然存在不一致。感谢您发布代码;我不太了解Objective-C,但我掌握了它的要点。我处理事情的方式,我不必以编程方式进行复制。再次感谢。
猜你喜欢
  • 2014-04-09
  • 2023-04-06
  • 1970-01-01
  • 2020-03-14
  • 1970-01-01
  • 2015-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多