Сохранение и чтение данных пользователя

В процессе учебы пишу игру по сбору слов, пришел к сохранению данных:

  • Очки (несколько типов).
  • Имя пользователя.
  • Уже собранные слова. Они хранятся в ArrayList в процессе игры. Но когда игрок выходит их надо сохранять до следующей игры.

Возник вопрос - что лучше использовать:

  1. Писать в .txt (я думаю худший вариант)
  2. Сохранять в SharedPreferences.
  3. Начинать учить Room?

Ответы (2 шт):

Автор решения: LeonSolya

Для каких-то единичных записей лучше использовать SharedPreferences, а в случае сохранения слов лучше сделать локальную бд вроде Realm или SQLLite. (по сути это та же запись в файл только уже реализованная)

→ Ссылка
Автор решения: Vlad Orlinskas

Если кратко - не пишите данные в файл!

Создавайте сущности например 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())
});

Поздравляю, вы реализовали работу с базами в вашем приложении. Асинхронно получили данные и обновили ваш интерфейс.

→ Ссылка