3

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

安卓空间

提前致谢!

4

2 回答 2

4

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

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

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

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

请注意,您实际上不能扩展 Room 本身。例如,您不能发明了解地理空间信息的新 Room 注释。如果该 SQL 破坏了 Room 的预期(例如,新关键字),Room 编译器可能会与您的地理空间 SQL 有问题。看起来他们添加的只是“只是”很多功能,所以希望 Room 能够正常运行。

于 2018-11-18T23:24:43.430 回答
1

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

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

于 2020-05-14T05:26:57.613 回答