【发布时间】:2018-11-18 23:13:53
【问题描述】:
我知道房间是 SQLite 上的一个抽象层,我只是想知道我是否可以将它用于不同类型的数据库。我想将 Room 用于具有地理空间支持的特殊版本的 SQLite,可以吗?我真的找不到关于这个的答案。
提前致谢!
【问题讨论】:
标签: android sqlite geospatial android-room android-architecture
我知道房间是 SQLite 上的一个抽象层,我只是想知道我是否可以将它用于不同类型的数据库。我想将 Room 用于具有地理空间支持的特殊版本的 SQLite,可以吗?我真的找不到关于这个的答案。
提前致谢!
【问题讨论】:
标签: android sqlite geospatial android-room android-architecture
是的,如果你愿意为它编写桥接代码。
您可以在RoomDatabase.Builder is openHelperFactory() 上调用的方法之一。这需要SupportSQLiteOpenHelper.Factory 的实例,这就是 Room 用于与底层数据库实现交互的方式。默认情况下,Room 使用FrameworkSQLiteOpenHelper.Factory,但您可以通过openHelperFactory() 提供自己的。
反过来,这将要求您在其他类上实现其他接口,例如SupportSQLiteDatabase。这基本上是一个包装器,其 API 有点类似于框架 API。您将这些调用转换为您希望使用的 SQLite 实现。
我以the SafeRoom library 的形式为Android 的SQLCipher 执行此操作。现在,我的实现有点笨拙,因为 Android 的 SQLCipher 有一些限制,希望很快就会解除。您将为您的特定 SQLite 实现创建相同类型的类。然后,将您的 SupportSQLiteHelper.Factory 插入您的 RoomDatabase.Builder,现在 Room 将与您的数据库实现对话。
请注意,您实际上不能扩展 Room 本身。例如,您不能发明了解地理空间信息的新 Room 注释。如果该 SQL 破坏了 Room 的预期(例如,新关键字),Room 编译器可能会与您的地理空间 SQL 存在问题。看起来他们添加的只是“只是”很多功能,所以希望 Room 能够正常运行。
【讨论】:
clearPassphrase 以允许开发人员控制密码清除行为。一些开发人员可能更喜欢清除密码并等待看看他们是否遇到来自 Room 的奇怪行为。从安全角度来看,清除密码短语会更好。
clearPassphrase 的默认值(即使用单个密码 arg 构造函数时)是 true,所以如果重用工厂出现问题,那么可能会导致一些意外的惊喜。
您可以使用我当前的用于 Android 房间的 spatialite 实现:
【讨论】:
geom 列的类型为MULTIPOLYGON。我正在使用 DAO 方法,但由于预期和找到的表结构之间存在差异,我遇到了运行时错误。我可能会在 SO 上发布一个单独的问题。