#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
исключение