6

JavaのPOJOオブジェクト私はsections.getValue()れをチェックしています次の行でLiveData.getValue()ルーム

public class Section { 

    @ColumnInfo(name="section_id") 
    public int mSectionId; 

    @ColumnInfo(name="section_name") 
    public String mSectionName; 

    public int getSectionId() { 
     return mSectionId; 
    } 

    public void setSectionId(int mSectionId) { 
     this.mSectionId = mSectionId; 
    } 

    public String getSectionName() { 
     return mSectionName; 
    } 

    public void setSectionName(String mSectionName) { 
     this.mSectionName = mSectionName; 
    } 
} 

マイQueryメソッド

@Query("SELECT * FROM section") 
LiveData<List<Section>> getAllSections(); 

へのアクセスDB

final LiveData<List<Section>> sections = mDb.sectionDAO().getAllSections(); 

にnullを返します。私はデータベースにデータを持っていますが、後で私はの値を取得していますが、常に私にnullを与えています方法。

sections.observe(this, new Observer<List<Section>>() { 
    @Override 
    public void onChanged(@Nullable List<Section> sections){ 

    } 
}); 

しかし、私が質問からLiveDataを省略すると、私は期待どおりにデータを取得しています。 照会方法:

@Query("SELECT * FROM section") 
List<Section> getAllSections(); 

へのアクセスDB:

final List<Section> sections = mDb.sectionDAO().getAllSections(); 
+1

なぜ、セクション.getValue()を使用したいのですが、livedataを使用してデータを観察します。次の行にチェックインしているときに、データがlivedataに設定されていないため、nullが返されます。 'LiveData'を使用したくない場合は、' LiveData'なしでそれを使用してください。 – Moinkhan

+1

私はlivedataを使いたい... 'sections.getValue()'がnullの場合データのためにapiを呼び出し、最終的にデータを取得する場所の 'onChange()'メソッドをデータベースに挿入する必要があります。しかし、データベースとAPIの両方からデータを取得して取得すると、その 'ヌル'値が原因です。 – CodeCameo

答えて

4

私はあなたのViewModelクラス内

を次のように私はこれがすべて必要です

private LiveData<List<Section>> mSections; 

@Override 
public LiveData<List<Section>> getAllSections() { 

    if (mSections == null) { 
     mSections = mDb.sectionDAO().getAllSections(); 
    } 

    return mSections; 
} 

同様の問題を解決し

private MediatorLiveData<List<Section>> mSectionLive = new MediatorLiveData<>(); 
    . 
    . 
    . 

    @Override 
    public LiveData<List<Section>> getAllSections() { 
     final LiveData<List<Section>> sections = mDb.sectionDAO().getAllSections(); 

     mSectionLive.addSource(sections, new Observer<List<Section>>() { 
      @Override 
      public void onChanged(@Nullable List<Section> sectionList) { 
       if(sectionList == null || sectionList.isEmpty()) { 
        // Fetch data from API 
       }else{ 
        mSectionLive.removeSource(sections); 
        mSectionLive.setValue(sectionList); 
       } 
      } 
     }); 
     return mSectionLive; 
    } 
+0

私を助けることができますか?私は同じ問題に直面しています、このコードをどこに置くべきですか? –

+0

ここに見つけることができます... https://github.com/codecameo/Shobdho – CodeCameo

+0

誰かが同じ問題に直面している場合、ソリューションは[MediatorLiveData](https://developer.android.com)にあります/reference/android/arch/lifecycle/MediatorLiveData.html)、これは他のLiveDataで観察できるサブクラスです。 –

1

nullであるsections.getValue()場合、私はデータのためのAPIを呼び出して、データベースにで

を を挿入する必要が

onChangeメソッドでこれを処理できます。

sections.observe(this, new Observer<List<Section>>() { 
    @Override 
    public void onChanged(@Nullable List<Section> sections){ 
     if(sections == null || sections.size() == 0) { 
      // No data in your database, call your api for data 
     } else { 
      // One or more items retrieved, no need to call your api for data. 
     } 
    } 
}); 

ただし、このデータベース/テーブル初期化ロジックをリポジトリクラスに配置する方がよいでしょう。 Google's sampleをチェックしてください。 DatabaseCreatorクラスを参照してください。

+0

私はすでにこの例を見ており、この問題は、アプリケーションが起動されるたびに、 'isDatabaseCreated()'が常にfalseを返すデータを持っているのに、 'createDb(Context context)'が呼び出されるたびに発生します。 – CodeCameo

1

このアプローチを通じて、この問題を解決します。 LiveDataのインスタンスを決して変更しないでください。私は、データベース内のデータを持っているし、後で私はonChangedイベント()メソッドで値を取得していますが、私はいつも私にはnullを与えているsections.getValueを()チェックしています次の行で

2

LiveDataを返すクエリが非同期で動作しているため、これは通常の動作です。この方法

LiveData<List<Section>> getAllSections(); 

のでcolling、あなたはここで

sections.observe(this, new Observer<List<Section>>() { 
@Override 
public void onChanged(@Nullable List<Section> sections){ 

} 
}); 

ドキュメントから結果を取得します:

ルーム(あなたがallowMainThreadQueriesを呼ばない限り、メインスレッド上のデータベースにアクセスすることはできません。 )をビルダーで使用すると、UIが長期間ロックされる可能性があるためです。非同期クエリ(LiveDataまたはRxJava Flowableを返すクエリ)は、必要に応じてバックグラウンドスレッドで非同期にクエリを実行するため、このルールは除外されています。

関連する問題