Android, Room, LiveData. Почему liveData инициирует событие, даже если dao возвращает null? - PullRequest
0 голосов
/ 08 ноября 2019

Я создал проект, как в этой статье https://developer.android.com/jetpack/docs/guide (здесь проект в github https://github.com/android/architecture-components-samples/blob/88747993139224a4bb6dbe985adf652d557de621/GithubBrowserSample/app/src/main/java/com/android/example/github/repository/NetworkBoundResource.kt), но он был написан на Kotlin, и я вообще не могу его понять, поэтому я написал на Java.

@Entity
public class MyEntity 
{
    @PrimaryKey
    @NonNull
    @SerializedName("id")
    @Expose
    private String id;
    @SerializedName("name")
    @Expose
    private String name;
}


@Dao
public interface MyEntityListDao 
{
    @Query("SELECT * FROM MyEntity")
    LiveData<List<MyEntity>> getAll();
}

@Database(entities = {MyEntity.class}, version = 1)
public abstract class MyDatabase extends RoomDatabase 
{
    public abstract MyEntityListDao entitiesDao();
}

А у меня на стороне клиента другой файл / метод (Вопрос - здесь):

    MediatorLiveData<Resource<ResultType>> result = new MediatorLiveData<>();
    // loading - factory method which returns new Resource(data)
    result.setValue(Resource.<ResultType>loading(null)); // null - argument of Resource constructor.

    // I expect that getAll() - returns null, and OnChanged - never will be run, because new data hasn't added. But onChanged works. Why?

    final LiveData<ResultType> dbSource = myDatabase.entitiesDao().getAll();
    result.addSource(dbSource, new Observer<ResultType>() {
        @Override
        public void onChanged(@Nullable ResultType resultType) {
            result.removeSource(dbSource);
            if(NetworkBoundResource.this.shouldFetch()) {
                NetworkBoundResource.this.fetchFromNetwork(dbSource);
            }
        ...
        }
    });
...