我知道房间是 SQLite 上的一个抽象层,我只想知道我是否可以将它用于不同类型的数据库。我想将 Room 用于具有地理空间支持的特殊版本的 SQLite,可以吗?我真的找不到关于这个的答案。
提前致谢!
我知道房间是 SQLite 上的一个抽象层,我只想知道我是否可以将它用于不同类型的数据库。我想将 Room 用于具有地理空间支持的特殊版本的 SQLite,可以吗?我真的找不到关于这个的答案。
提前致谢!
是的,如果您愿意为它编写桥接代码。
您可以在 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 能够正常运行。
您可以使用我当前对 Android 房间的 spatialite 实现: