Как хранить данные Google Cloud Firestore локально, имея сложную структуру? - PullRequest
1 голос
/ 17 июня 2019

У меня есть база данных в Google Cloud Firestore, и я создаю приложение для 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 */

1 Ответ

1 голос
/ 18 июня 2019

Мой вопрос: каков наилучший способ хранения моих данных и как реализовать это наилучшим образом?

Если вы хотите сохранить данные в своем телефоне, вы можете попробовать с помощью SQLite или Библиотека постоянства помещения , где вы можете определить базу данных из этой структуры, которую вы нам показали, и иметь возможность запрашивать ее для сохраненных документов.

Таким образом, после первогоПолучив документ, вы можете сохранить его в базе данных.При последующих попытках получить его сначала проверьте, хранится ли он в вашей базе данных.Если это не так, вы можете продолжить получать его из Firestore (и сохранить его локально).

Другой ресурс, который я использовал для локального хранения и сохранения данных, - Общие настройки Android .Это IMHO менее сложно, чем использование SQLite или Room, но имеет свои ограничения для сложных структур данных (AFAIK, он может хранить только примитивные данные и StringSets) ... Хорошая новость заключается в том, что вы можете сохранить свой документ какСтрока JSON и легко сохраните ее в общих настройках (на самом деле, структура вашего документа действительно соответствует формату JSON, поскольку у него есть карты, массивы и т. Д.).

Если вы используете это, тоследуйте тому же принципу и проверьте в своих общих настройках, есть ли документ, перед тем, как получить его из Firestore.

...