Make Room DAO返回LiveData <cursor>

时间:2017-08-05 16:59:48

标签: android android-cursor android-room android-livedata

你知道如何让Room DAO返回LiveData<Cursor>吗?

我需要从我的DB请求很多对象 由于内存问题,我没有负担得起重物列表,我需要一个光标 当然数据可以更新,我需要在发生时通知 所以LiveData<Cursor>应该是一个很好的解决方案。

但是,当我编译它时:

@Dao
public interface FooDao {

    @Query("SELECT * FROM foo")
    LiveData<Cursor> getFoo();

}

Android Studio对我说: Error:(22, 22) error: Not sure how to convert a Cursor to this method's return type

嗯...请不要告诉我,我们无法通过光标通知数据更新:/

2 个答案:

答案 0 :(得分:1)

感谢评论中的@pskink,这是我的解决方案:

public class DbLiveData<T>
        extends MutableLiveData<T> {

    public interface DataLoader<T> {

        T loadData();

    }

    @NonNull
    private final InvalidationTracker.Observer mDatabaseObserver;

    @NonNull
    private DataLoader<T> mDataLoader;

    @NonNull
    private final Executor mExecutor;

    public DbLiveData(@NonNull String[] tables, @NonNull Executor executor, @NonNull DataLoader<T> dataLoader) {
        mExecutor = executor;
        mDataLoader = dataLoader;
        mDatabaseObserver = new InvalidationTracker.Observer(tables) {
            @Override
            public void onInvalidated(@NonNull Set<String> tables) {
                loadData();
            }
        };
        loadData();
    }

    @Override
    protected void onActive() {
        super.onActive();
        DB.get() // I get my DB from a Service Locator
                .getInvalidationTracker()
                .addObserver(mDatabaseObserver);
    }

    @Override
    protected void onInactive() {
        super.onInactive();
        DB.get() // I get my DB from a Service Locator
                .getInvalidationTracker()
                .removeObserver(mDatabaseObserver);
    }

    private void loadData() {
        mExecutor.execute(
                () -> postValue(mDataLoader.loadData())
        );
    }

}

我创建了一个管理InvalidationTracker.Observer的LiveData。你只需要将DataLoader传递给构造函数,这个必须从数据库中获取Cursor
像这样:

new DbLiveData<Cursor>(
    new String[] { "foo" },
    getExecutor(), // Provide an Executor
    () -> DB.get() // I get my DB from a Service Locator
            .fooDao()
            .getFoo()
)

答案 1 :(得分:0)

如果使用Room 2.x,则可以使用RoomDatabase实例

const instagramlikes = Symbol();
const sitetraffic = Symbol();
const dailytraffic = Symbol();

function clientwidgets(x) {
  if (x === instagramlikes) {
    return "This is A";
  } else if (x === sitetraffic) {
    return "This is B";
  } else if (x === dailytraffic) {
    return "This is C";
  }
};

console.log(clientwidgets(instagramlikes));
console.log(clientwidgets(sitetraffic));
console.log(clientwidgets(dailytraffic));

table1,table2是要观察的表。 如果您要在交易中执行完computeFunction(last function arg),请提供true作为第二个参数