Не удается получить простую строку из SQLite

#java #android #sqlite #android-room

#java #Android #sqlite #android-комната

Вопрос:

Я следую архитектуре приложения ViewModel для Android и сталкиваюсь с проблемой при извлечении некоторых простых данных из базы данных SQLite. Вот упрощенная версия моего DAO и моего репозитория:

DAO:

 @Dao
public interface UserStuffDao {
    @Query("SELECT * from UserStuff")
    List < UserStuff > getAllUsers();

    @Query("SELECT path_to_user_profile_pic from UserStuff where id=:id")
    LiveData < String > getPathToUserProfilePic(Long id);
}
 

РЕПОЗИТОРИЙ:

 public class UserStuffRepository {
    private static UserStuffRepository instance;
    private static UserStuffDao userStuffDao;
    public static final String TAG = UserStuffRepository.class.getSimpleName();


    public static UserStuffRepository getInstance(Application application) {
        Log.d(TAG, "[getInstance] called");
        if (instance == null) {
            instance = new UserStuffRepository();
            Database db = Database.getDatabase(application.getApplicationContext());
            userStuffDao = db.userStuffDao();
        }
        return instance;
    }


    public MutableLiveData < UserStuff > getUserStuff(Long id) {
        final MutableLiveData < UserStuff > userData =
            new MutableLiveData < > ();

        LiveData < String > info = userStuffDao.getPathToUserProfilePic(id);
        Log.d(TAG, "[getuserStuff] the dao returned ---> "   info.getValue());
        UserStuff to_return = new UserStuff(id, info.getValue());
        userData.setValue(to_return);

        return userData;
    }

    public void geteverything() {

        new AsyncTask < Void, Void, Void > () {
            @Override
            protected Void doInBackground(Void...voids) {
                Log.d(TAG, " EVERYTHING IN THE DATABASE "   userStuffDao.getAllUsers());
                return null;
            }
        }.execute();
    }
}
 

Проблема в том, что когда я вызываю метод getUserStuff(Long id) из репозитория (который затем вызывает метод из DAO), я получаю null ( Log.d(TAG,"[getuserStuff] the DAO returned ---> " info.getValue()); печатает null). У меня есть кнопка, которая печатает все, что у меня есть в базе данных, и в ней явно есть данные, и DAO должен что-то вернуть. Пример:

Вызов geteverything():

 D/UserStuffRepository: EVERYTHING IN THE DATABASE [UserStuff{id=1, path_to_user_profile_pic='/path/path'}] 
 

Затем вызов getUserStuff(1) возвращает UserStuff с идентификатором 1 и pathToUserProfilePic, равным null.

Вы видите какую-либо явную проблему, или я должен публиковать дополнительные материалы, такие как инициализация репозитория, ViewModel и некоторые вещи из MainActivity? Спасибо!

Комментарии:

1. вы проверили идентификатор? Существует ли идентификатор в базе данных?

2. очевидно, что она вернется null , поскольку в то время, когда вы вызывали getValue ее, еще не выполняли запрос к БД… вы должны использовать LiveData.observe(XXX) для получения значения после выполнения SQL-запроса

3. @Selvin tnx, не знаю, как я этого не заметил. Я всегда пропускаю эти операции фонового потока. Увидел, в чем была моя проблема, внес несколько изменений во все, теперь работает так, как ожидалось. Не стесняйтесь давать ответ, чтобы я мог его принять.

Ответ №1:

Измените свою функцию, чтобы вернуть простую строку

 LiveData<String> getPathToUserProfilePic(Long id);
 

К этому

 String getPathToUserProfilePic(Long id);
 

И, конечно, измените способ ее получения

 String info = userStuffDao.getPathToUserProfilePic(id);
Log.d(TAG," [getuserStuff] the dao returned ---> "   info);
 

Я почти уверен, что вам не нужны там LiveData, потому что вы сохраняете строку в UserStuff.

Комментарии:

1. Я почти уверен, что это вызовет Cannot access database on the main thread исключение