Сохранение и чтение данных пользователя
В процессе учебы пишу игру по сбору слов, пришел к сохранению данных:
- Очки (несколько типов).
- Имя пользователя.
- Уже собранные слова. Они хранятся в ArrayList в процессе игры. Но когда игрок выходит их надо сохранять до следующей игры.
Возник вопрос - что лучше использовать:
- Писать в .txt (я думаю худший вариант)
- Сохранять в SharedPreferences.
- Начинать учить Room?
Ответы (2 шт):
Для каких-то единичных записей лучше использовать SharedPreferences, а в случае сохранения слов лучше сделать локальную бд вроде Realm или SQLLite. (по сути это та же запись в файл только уже реализованная)
Если кратко - не пишите данные в файл!
Создавайте сущности например User, Achievements и Words. Сущность User будет хранить в себе следующие поля id, name, achievementsId (тут интересный момент). Необратим момент столкновения с базами данных. БД состоит из таблиц, таблицы хранят в полях данные какой либо сущности, в нашем случаи user, между таблицами существую "отношения" и БД имеют "нормальные формы" (почитайте о том, что в кавычках). Это очень просто и очевидно, вы сразу все поймете.
Быстрый старт Room https://developer.android.com/training/data-storage/room Room это прекрасная ORM (ORM — технология программирования, которая связывает базы данных с концепциями объектно-ориентированных языков программирования). Она создаст смешную по простоте абстракцию для работы с БД.
LiveData наш мост между данными в таблице и готовой к работе сущностью. LiveData - хранилище данных, работающее по принципу паттерна Observer (наблюдатель). https://developer.android.com/topic/libraries/architecture/livedata#java
Поскольку Room по умолчанию запрещает запросы в основном потоке, нам нужна liveData. Вы еще здесь?
Просто в вашей UserDao. Оберните ваши данные в LiveData.
// java
@Dao
public interface UserDao {
@Query("SELECT * FROM user")
LiveData<List<User>> getAll();
// kotlin
@Dao
interface UserDao {
@Query("SELECT * FROM user")
fun getAll(): LiveData<List<User>> // вот тут
В вашей активити подпишитесь (observe) на вашу liveData
myUserLiveData.observe(this, user -> {
userTextView.setText(user.getName())
});
Поздравляю, вы реализовали работу с базами в вашем приложении. Асинхронно получили данные и обновили ваш интерфейс.