【问题标题】:"Table name too long" crash with realm-cocoa (Realm DB)“表名太长”与领域可可(领域数据库)崩溃
【发布时间】:2020-12-18 17:21:51
【问题描述】:

将一些代码移入框架后,我收到“表名太长”错误。在通过堆栈跟踪后,在创建模式时中断以获取表名,然后手动尝试创建更长的表名。我已经确定了有问题的名称。有问题的表名是链接表,Realm 中有没有办法使用 className() 或其他方式强制该表的名称用于链接表?

引发的领域错误的屏幕截图。

【问题讨论】:

  • MongoDB Realm (和之前的)没有表,所以你能更具体一点你指的是什么,甚至在你的问题中包含导致错误的代码吗?请花点时间查看How do I ask a good question?How to create a Minimal, Complete, and Verifiable example
  • 领域对象通常被称为类,但它们在存储方式上仍然转换为表。源代码本身将它们称为“表”。我引用的错误来自 Realm 源代码。问题正是我所描述的表(类)名称超出了 63 个字符的限制。我只想知道是否有一种方法可以覆盖名称,而不是基于 Swift 类名称。
  • 该代码是来自 Realm 还是其他库?
  • 我理解您的描述,但需要澄清一下:MongoDB Realm is a NoSQL database 并且是一个非表格数据库 - 它没有表格。此外,如果您仔细查看问题中的屏幕截图,那是一个非公开的 API,因此您的代码不应依赖字符串的内容。因此,您实际上是在说您的班级名称太长,这会造成问题。这在 10.2 版中得到了部分解决,因为文件名(类名)在写入磁盘时显着缩短。
  • Jay,您的评论混淆了我提出的问题,您指的是 MongoDB Realm 平台。该平台由 3 个组件组成,Realm DB(在设备上)、同步服务器和云中的 Mongo DB。虽然设备上的数据库是 noSQL,但它仍然将类映射到表。这不是我使用了不正确的术语,这是领域源代码中使用的术语。我发布的截图是 Realm 在启动时引发崩溃的应用程序中引发的错误的人类可读查找。

标签: swift realm realm-database


【解决方案1】:

经过进一步调查,事实证明解决此问题的方法是在我的应用程序中创建该类型的子类。由于我的代码的结构,Realm 使用提交的类名、包名和泛型类型创建表名。这使得名称太长了。当您在实际应用程序中使用显式泛型类型对类型进行子类化时,Realm 不再需要担心包名称或泛型名称。下面应该有助于说明问题和解决方案。

class PackageA.One<I>: RealmSwift.Object {
   var List<I> = List<I>()
}

class App.Two: RealmSwift.Object {

}

let realmObjectsToRegister = [Package.One<App.Two>.self]

以上导致 Realm 创建了一个表名“TtGC11PackageA9OneC9App18Two”,但我的应用程序中的真实姓名使其超过 57 个字符(最大表名长度)。

通过以下操作,我缩短了名称并修复了问题

class PackageA.One<I>: RealmSwift.Object {
   var List<I> = List<I>()
}

class App.Two: RealmSwift.Object {

}

class App.AppOne: PackageA.One<App.Two> {}

let realmObjectsToRegister = [App.AppOne.self]

然后,该解决方案导致领域将表命名为“AppOne”,并修复了长名称问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多