CjS*_*CjS 4 android android-cursorloader commonsware-cwac
我正在尝试使用Commonsware中使用Loader的适配器实现DataListFragment.此Loader直接使用SQLiteDatabase,不需要使用ContentProviders.
关于Loaders的android参考说明:"当Loaders处于活动状态时,他们应该监视数据源,并在内容发生变化时提供新的结果."
在我的SQLiteCursor实现(下面)中,这不会发生.OnLoadFinished()被召唤一次就是这样.据推测,可以Loader.onContentChanged()在底层数据库发生更改的情况下插入调用,但通常数据库代码类不了解加载器,所以我不确定实现它的最佳方法.
有没有人有任何关于使Loader"数据感知"的建议,或者我应该将数据库内容包装为ContentProvider并使用CursorLoader代替?
import com.commonsware.cwac.loaderex.SQLiteCursorLoader;
public class DataListFragment extends ListFragment implements LoaderManager.LoaderCallbacks<Cursor>{
protected DataListAdapter mAdapter; // This is the Adapter being used to display the list's data.
public SQLiteDatabase mSqlDb;
private static final int LOADER_ID = 1;
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
int rowlayoutID = getArguments().getInt("rowLayoutID");
// Create an empty adapter we will use to display the loaded data.
// We pass 0 to flags, since the Loader will watch for data changes
mAdapter = new DataListAdapter(getActivity(),rowlayoutID, null , 0);
setListAdapter(mAdapter);
// Prepare the loader. Either re-connect with an existing one,
// or start a new one.
LoaderManager lm = getLoaderManager();
// OnLoadFinished gets called after this, but never again.
lm.initLoader(LOADER_ID, null, this);
}
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
String sql="SELECT * FROM "+TABLE_NAME+";";
String[] params = null;
SQLiteCursorLoader CursorLoader = new SQLiteCursorLoader(getActivity(), mSqlDb, sql, params);
return CursorLoader;
}
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
// Swap the new cursor in. (The framework will take care of closing the old cursor once we return.)
mAdapter.swapCursor(data);
// The list should now be shown.
if (isResumed()) { setListShown(true);}
else { setListShownNoAnimation(true); }
}
public void onLoaderReset(Loader<Cursor> loader) {
// This is called when the last Cursor provided to onLoadFinished()
// above is about to be closed. We need to make sure we are no
// longer using it.
mAdapter.swapCursor(null);
}
Run Code Online (Sandbox Code Playgroud)
Com*_*are 20
该Loader文件是有缺陷的.
LoaderAndroid内置的100%实现"监控数据源并在内容发生变化时提供新结果".由于目前LoaderAndroid中只有一个内置实现,因此它们的文档准确无误.
但是,引用我应该在一两个小时内发布的一本书的更新:
框架中没有任何内容需要此行为.此外,在某些情况下,这样做显然是一个坏主意 - 想象一下Loader从Internet上加载数据,需要不断轮询某个服务器以查找更改.
SQLiteCursorLoader如果您通过它路由所有数据库修改,我确实计划扩充以至少更多地了解数据库更改.这也有局限性,因为您不在Loader活动之间共享对象(更不用说从服务访问它们).
这样做的唯一原因CursorLoader是因为它使用了ContentProvider一个单例,因此可以知道所有操作.
目前,您的代码中负责插入,更新和删除的任何部分都需要点击SQLiteCursorLoader肩膀并让它更新,或通知活动更改(例如,从a广播Service),以便活动可以轻拍SQLiteCursorLoader肩膀.
| 归档时间: |
|
| 查看次数: |
3867 次 |
| 最近记录: |