我可以将 Room Persistence 用于不同类型的数据库吗?

Can I use Room Persistence for a different type of Database?

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

Android Spatialite

提前致谢!

可以,如果你愿意为它写桥代码。

您可以在 RoomDatabase.Builder is openHelperFactory() 上调用的方法之一。这需要一个 SupportSQLiteOpenHelper.Factory 的实例,这就是 Room 用于与底层数据库实现交互的实例。默认情况下,Room 使用 FrameworkSQLiteOpenHelper.Factory,但您可以通过 openHelperFactory() 提供自己的

反过来,这将要求您在其他 类 上实现其他接口,例如 SupportSQLiteDatabase。这基本上是一个包装器,带有一个有点类似于框架 API 的 API。您将这些调用转换为您希望使用的 SQLite 实现。

我为 SQLCipher for Android 做了这个,形式为 the SafeRoom library。现在,我的实现有点笨拙,因为 SQLCipher for Android 的一些限制有望很快解除。您将为特定的 SQLite 实现创建相同类型的 类。然后,将您的 SupportSQLiteHelper.Factory 插入您的 RoomDatabase.Builder,现在 Room 将与您的数据库实现对话。

请注意,您实际上不能扩展 Room 本身。例如,您无法发明了解地理空间信息的新 Room 注释。如果 SQL 破坏了 Room 的预期(例如,新关键字),Room 编译器可能会遇到您的地理空间问题 SQL。看起来他们添加的是 "just" 很多功能,所以希望 Room 表现良好。

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

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