android - 如何在本地存储具有复杂结构的 Google Cloud Firestore 数据?
问题描述
我在 Google Cloud Firestore 上有一个数据库,我正在 Kotlin 中制作一个 Android 应用程序来访问它。数据库只有一个集合,但有很多文档。一次用户只需要大约 5-6 个文档。在线数据库的原因是将来可以轻松添加更多文档。下载后,下载的文档数据很少会更新。所以,下载后,我希望他们在没有互联网的情况下访问。
我的问题是,即使文档存储在本地,要访问它们,我也必须设置一个侦听器,因此代码变得异步,这使事情变得非常复杂。所以我想以不同的方式将它们存储在本地,这样我就可以毫不拖延地访问数据。
这是我从缓存中访问文档的方式:
val db = FirebaseFirestore.getInstance().collection("courses")
db.document("doc_name").get(Source.CACHE).addOnCompleteListener { task ->
if (task.isSuccessful) {
// what to write here
// to store the data locally
// if some other method is used ?
} else {
// documents need to be re-downloaded
}
}
我的问题是存储数据的最佳方式是什么,以及如何实施这种最佳方式?鉴于所有文档都具有类似但非常复杂的结构,如下所示。
collection/doc_example/
:
|----string
|
|----string
|
|----map
| |----string
| |----int
|
|----int
|
|----array{size=3, type=int}
|
|----string
|
|----map
| |----int
| |----array{size=variable, type=map}
| |----map
| |----string
| |----int
| |----array{size=variable, type=string}
|
|----array{size=variable, type=string}
|
|----array{size=variable, type=string} /* note - this array is optional */
|
|----array{size=variable, type=map}
|----map
|----string
|----string
|----int
|----string
|----string /* note - this one string is optional */
解决方案
我的问题是存储数据的最佳方式是什么,以及如何实施这种最佳方式?
如果你想在手机中持久化数据,你可以尝试使用SQLite或Room Persistence Library,你可以从你展示给我们的这个结构中定义一个数据库,并能够查询它以获取存储的文档。
这样,在第一次获得文档后,您就可以将其存储在数据库中。在将来尝试获取它时,您应该首先检查它是否存储在您的数据库中。如果不是,那么您可以继续从 Firestore 获取它(并将其保存在本地)。
我用来在本地存储和持久化数据的另一个资源是通过Android Shared Preferences。恕我直言,这比使用 SQLite 或 Room 简单,但它对复杂数据结构有限制(AFAIK,它只能存储原始数据和 StringSets)......好消息是您可以将文档保存为 JSON 字符串和轻松地将它存储在您的共享首选项中(实际上,您的文档结构对于 JSON 格式来说确实足够了,因为它有地图、数组等)。
如果使用它,那么您将遵循相同的原则,并在必须从 Firestore 中获取文档之前检查您的共享首选项是否存在该文档。
推荐阅读
- javascript - 它总是显示一个输出,要么突出显示关键字,要么只显示警告框,如何同时实现两者
- c++ - 我怎样才能输出一个漂亮整洁的列?
- javascript - AdonisJs 中的 not_required_when 验证器
- html - 努力使 div 的形状与图像形状相同
- javascript - 如何使用Javascript突出显示日历中不同月份的多个日期?
- swift - 如何在我的表格视图中修复我的部分中的单元格的分离集合?
- ios - 为什么不能生孩子
[] 在正文中:中心小部件? - python - 如何通过将其域更改为新的目标域来重新映射数字列表?
- precision - 如何使用 jq 提取数字格式的浮点值而不是指数值?
- oracle - PLSQL - 当它们为NULL时查找两个值相等