你知道如何让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
嗯...请不要告诉我,我们无法通过光标通知数据更新:/
答案 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作为第二个参数