核心数据模型设计 - 更改“活动”对象也会更改已保存的对象

2024-02-21

我正在开发我的第一个 Core Data 项目(在 iPhone 上)并且我真的很喜欢它。核心数据是很酷的东西。

然而,我遇到了一个设计困难,我不确定如何解决,尽管我认为这是一个相当常见的情况。它涉及数据模型。

为了清楚起见,我将使用一个想象的足球比赛应用程序作为示例来说明我的问题。假设有 NSMO,称为 Downs 和 Plays。播放功能类似于唐斯使用的模板。用户创建 Play(例如 Bootleg、Button Hook、Slant Route、Sweep 等)并填写各种属性。戏剧与唐斯有一对多的关系。对于每个 Down,用户决定使用哪个 Play。当执行 Down 时,它使用 Play 作为其模板。每次运行后,都会将其存储在历史记录中。该程序会记住所有打过的唐斯比赛。

到目前为止,一切都很好。这一切工作正常。

我的问题涉及当用户想要更改 Play 的详细信息时会发生什么。假设它最初涉及向左传球,但用户现在希望它是向右传球。然而,进行这一更改不仅会影响该 Play 的所有未来执行,而且还更改历史记录中存储的 Play 的详细信息。实际上,唐斯的记录被“污染”了,因为播放模板已被更改。

我一直在研究针对这种情况的几种可能的解决方案,但我想 SO 的天才们比我更了解如何处理这个问题。尽管如此,我提出的潜在解决方案是:

  1. 戏剧的“版本控制”。对 Play 模板的每次更改实际上都会创建一个具有相同名称的新的、单独的 Play 对象(据用户所知)。然而,在幕后,它实际上是一个不同的游戏。这会起作用,AFAICT,但似乎它可能会导致 Play 对象的疯狂扩散,尤其是。如果用户不断在同一 Play 的多个版本之间来回切换(每次用户切换时都会创建一个又一个对象)。是的,该应用程序可以检查预先存在的相同的 Plays,但是......它看起来就像一团糟。

  2. 让唐斯在保存时记录他们使用的 Play 的详细信息,但不作为 Play 对象。这看起来很荒谬,因为 Play 对象是there只保留那些细节。

  3. 认识到 Play 对象实际上实现了 2 个功能:一是作为 Down 的模板,二是记录使用的模板。这两个函数与 Down 有不同的关系。第一个(模板)具有一对多关系。但第二个(记录)具有一对一的关系。这意味着创建第二个对象,例如“Play-Template”,它将保留与 Downs 的一对多关系。播放对象将被重新配置为具有一对一与唐斯的关系。 Down 将使用 Play-Template 对象来执行,但使用新类型的 Play 对象来存储所使用的模板。正是这种从一对多关系到一对一关系的转变才是问题的症结所在。

即使把这个问题写出来也帮助我变得更加清晰。我认为解决方案 3 之类的东西就是答案。然而,如果有人有更好的想法,或者只是确认我走在正确的轨道上,那将会很有帮助。 (请记住,我并不是真的在制作足球游戏,只是使用每个人都能理解的比喻更快/更容易。)


我认为你需要重新开始你的设计。

(1) 为什么使用PlayEntity作为DownEntity的模板?实体实际上是(在底层)类,因此类定义本身就是每个实例的“模板”。

(2) 被管理对象应代表真实对象或真实信息关系的数据模型。因此,您需要认真思考您想要建模的真实对象或信息是什么。一个好的起点是问问自己如何用笔和纸记录这些信息。

在你的例子中,上场和下场模拟了完全不同的东西。

Down 是按时间顺序发生的事件。在任何特定的游戏中,只有一个特定的“Down”。这意味着足球历史上每场比赛中的每场比赛都是独一无二的。因此,Down 数据模型实体主要感兴趣的是对Down 与其他Down 以及整个游戏的时间关系进行建模。

相比之下,戏剧是一个空间事件。比赛并不是唯一的,并且经常在一场比赛中以及在一场比赛之间重复出现。比赛实体应该关注球员、球和场地之间的空间关系。

你最终会得到这样的结果:

DownEntity{
    game;
    half;
    quarter;
    turnover;
    gameClockTime;
    yardLine;
    penalties;
    play --(required,Cascade)->PlayEntity.down
    previousDown --(optional, nullify)-->Down.nextDown;
    nextDown --(optional, nullify)-->Down.previousDown
}


PlayEntity {
    playName;
    //whatever other detail you want to model
    down --(optional,nullify)-->>DownEnity.play;
}

请注意,两个实体都不会复制另一个实体的属性中保存的信息。它们也不共享继承,因为它们没有对游戏的相同方面进行建模。 Down 模拟时间序列,Play 模拟空间序列。这需要他们两个都完整地描述每一次下来所发生的事情。

您可以通过首先创建您想要的任何标准化 PlayEntities 来构建数据库。如果您有一部小说,您将创建一个新的 PlayEntity 并根据需要填充它。每次您有一个 Down 时,您都会创建一个 DownEntity 并创建与现有或新创建的 PlayEntity 的关系。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

核心数据模型设计 - 更改“活动”对象也会更改已保存的对象 的相关文章

  • 与 Objective-C 的 VPN 连接

    有没有办法在 iPhone 的 Objective C 中以编程方式建立 VPN 连接 有这方面的好教程吗 有人知道吗 多谢 我认为第三方应用程序无法访问这些 API
  • 如何在应用程序项目中使用 Cocoa Touch 框架

    我熟悉构建单个 iOS 应用程序 但我坚持使用 Cocoa Touch 框架向多个应用程序共享通用代码 问题 框架的头文件不可见 无法链接到消费应用程序项目 我做了什么 1 我创建了一个名为 libTestFramework 的项目 Coc
  • 如何在 Swift 中使用 CoreBluetooth 更新 BLE 设备的电池电量?

    func peripheral peripheral CBPeripheral didDiscoverCharacteristicsFor service CBService error Error for c in service cha
  • iPhone SQLite页面缓存不断增长

    I use sqlite数据库用于存储 还有许多数据库事务 我的问题是 sqlite 页面缓存的内存使用量快速增长 在instruments我可以找到这条线 Graph Category Live Bytes Living Transien
  • 如何使用 SwiftUI 获取多个屏幕上的键盘高度并移动按钮

    以下代码获取键盘显示时的键盘高度 并将按钮移动键盘高度 在转换源 ContentView 和转换目标 SecibdContentView 处以相同的方式执行此移动 但按钮在转换目标处不移动 如何使按钮在多个屏幕上移动相同 import Sw
  • 使用特定的 url 启动 UIWebview

    我目前有一个包含四个按钮的视图 并且希望能够启动 UIWebview 并为每个不同的按钮提供特定的 url 我目前可以使用 url 从外部启动 safari 我知道我可以使用代码在每个按钮中显示 UIWebview 并且可以在 UIWebv
  • 如何区分 iTunes Connect / Apple TestFlight 上的 STAGE 和 PRODUCTION 版本?

    阶段构建与阶段服务器的对话 阶段服务器与生产服务器尽可能相同 以用于测试目的 生产构建与生产服务器的通信 生产服务器存储真实的关键数据 这些构建本质上是针对同一应用程序的 但是 iTunes Connect 界面将向您显示以下内容 即构建由
  • SceneKit unproject Z 文档解释?

    我正在经历一些 SceneKit 概念 而我试图在脑海中巩固的一个概念是 unprojectPoint 我知道该函数将获取 2D 中的一个点并返回 3D 中的一个点 因此具有正确的 Z 值 当我阅读文档时 我读到了以下内容 method u
  • 如何解决 iOS 6 SDK 中的 hidesBottomBarWhenPushed 行为异常的问题?

    我遇到了中描述的相同问题这个 OpenRadar 问题 http www openradar me 14670329 正如那里所说 摘要 UIViewController的hidesBottomBarWhenPushed属性 对于使用 iO
  • iOS Swift 在后台下载大量小文件

    在我的应用程序中 我需要下载具有以下要求的文件 下载大量 例如 3000 个 小 PNG 文件 例如 5KB 逐个 如果应用程序在后台继续下载 如果图像下载失败 通常是因为互联网连接丢失 请等待 X 秒然后重试 如果失败Y次 则认为下载失败
  • 在 UITableViewController 中重新排序行后 UI 更新不正确

    因此 我对表中的行重新排序 用户界面最终结果不正确 场景如下 表内容原文 a b c d e 如果我移动第 0 行 当前a 到第 4 行 当前e 我看到的最终结果是 c d e a a 一些背景 该表正在读取 Realm 对象的列表 我确认
  • 带约束的嵌套集合视图的意外行为 (Swift 4)

    我的表格视图中有一个单元格 其中包含水平分页集合视图 该集合视图的每个页面内都有一个垂直集合视图 为了避免 滚动滚动 问题 我在垂直集合视图中禁用了垂直滚动 垂直集合视图的单元格计数不是静态的 可以是任意数字 因此 这会产生一个问题 集合视
  • 将 Armadillo C++ 库导入 Xcode

    我是 Mac 用户 正在尝试安装和导入 C Armadillo 库 以下是我到目前为止所采取的步骤 1 我从其网站下载了犰狳库 2 我仔细阅读了下载文件中的 Readme txt 文件 解释了如何安装它 3 我使用CMake将犰狳下载文件制
  • 访问 google reader 的 Endpoints API 时出错

    我正在尝试在iPhone APP中实现google reader 到目前为止我已经成功收到了sid and auth 当我尝试使用以下命令调用 Endpoints API 时 问题就出现了GET 这是代码 ASIHTTPRequest re
  • 使用 BGTaskScheduler 进行后台获取与调试模拟完美配合,但在实践中却不起作用

    我在 appDelegate 的 didFinishLaunchingWithOptions 中注册后台获取任务 BGTaskScheduler shared register forTaskWithIdentifier Backgroun
  • cameraOverlayView 防止使用 allowedEditing 进行编辑

    在我的应用程序中 使用以下行在拍摄照片后对其进行编辑 移动和缩放 效果很好 imagePicker setAllowsEditing YES 但如果我还使用cameraOverlayView 则编辑模式将不再起作用 屏幕出现 但平移和捏合手
  • XCode 7 中的 AWSS3TransferManagerUploadRequest

    我今天升级到 Xcode 7 Swift 2 0 我的项目正在使用 CocoaPods 我正在 POD 文件中导入所有与 AWS 相关的文件 我已经设置了桥接标头 并导入了 Amazon 告诉我的所有文件 在升级到 Swift 2 0 之前
  • 如何在 iOS 上固定证书的公钥

    在提高我们正在开发的 iOS 应用程序的安全性时 我们发现需要对服务器的 SSL 证书 全部或部分 进行 PIN 操作以防止中间人攻击 尽管有多种方法可以做到这一点 但当您搜索此内容时 我只找到了固定整个证书的示例 这种做法会带来一个问题
  • 子类 PFObject 上的 PFUser 属性

    我使用以下类 动态属性以及 m 文件中的 load 和 parseClassName 方法 对 PFObject 进行了子类化 interface DAOpponents PFObject
  • 无需越狱即可检测iOS9上哪个应用程序处于前台

    我正在尝试记录用户在 iOS9 上的个人应用程序使用情况 我宁愿它不会使用越狱有限的解决方案 不言自明 在越狱手机上执行此应用程序的变体应该不难 https www andyibanez com create mobilesubstrate

随机推荐