【问题标题】:Can I use Room Persistence for a different type of Database?我可以将房间持久性用于不同类型的数据库吗?
【发布时间】:2018-11-18 23:13:53
【问题描述】:

我知道房间是 SQLite 上的一个抽象层,我只是想知道我是否可以将它用于不同类型的数据库。我想将 Room 用于具有地理空间支持的特殊版本的 SQLite,可以吗?我真的找不到关于这个的答案。

Android Spatialite

提前致谢!

【问题讨论】:

    标签: android sqlite geospatial android-room android-architecture


    【解决方案1】:

    是的,如果你愿意为它编写桥接代码。

    您可以在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 能够正常运行。

    【讨论】:

    • 感谢您的信息。我认为 Room Persistence 仅适用于 SQLite。
    • @jzarsuelo 您是否设法实现了 Room-Spatialite 桥接?如果是,请分享!
    • @Mark:“你知道 Room 是否重用了 openHelperFactory?” -- 我不相信行为是指定的。 “我们不应该使用带有 clearPassphrase=false 的 sqlcipher 的 SupportFactory() 吗?” - 嗯,这个答案早于您所指的内容。我们特别添加了clearPassphrase 以允许开发人员控制密码清除行为。一些开发人员可能更喜欢清除密码并等待看看他们是否遇到来自 Room 的奇怪行为。从安全角度来看,清除密码短语会更好。
    • 谢谢马克。只是 clearPassphrase 的默认值(即使用单个密码 arg 构造函数时)是 true,所以如果重用工厂出现问题,那么可能会导致一些意外的惊喜。
    • @Mark:总体而言,Android 的 SQLCipher 默认倾向于更高的安全性。而且在这种情况下,虽然我没有参与 SQLCipher 的日常工作,但我没有听说任何问题。
    【解决方案2】:

    您可以使用我当前的用于 Android 房间的 spatialite 实现:

    https://github.com/anboralabs/spatia-room

    【讨论】:

    • 感谢您的链接。我目前正在寻找可以在项目中使用的 Android Spatialite 库。 Sevar83 的库似乎已过时,因为它已近 2 年没有更新。会检查你的。
    • @znovotny 告诉我是否对您有用。
    • 达尔文,你用过 Spatia-Room 和真正的 SpatiaLite 数据库吗?我很难使用我的数据库,该数据库有一个表,其中geom 列的类型为MULTIPOLYGON。我正在使用 DAO 方法,但由于预期和找到的表结构之间存在差异,我遇到了运行时错误。我可能会在 SO 上发布一个单独的问题。
    • @znovotny 请创建问题或发布项目,让我帮助您解决问题,我已将我的库用于一些辅助项目。效果很好。
    猜你喜欢
    • 2018-01-19
    • 1970-01-01
    • 2021-09-02
    • 2018-05-27
    • 2018-01-22
    • 1970-01-01
    • 1970-01-01
    • 2020-03-19
    • 1970-01-01
    相关资源
    最近更新 更多