gpt4 book ai didi

android - CursorLoader 不显示数据库条目

转载 作者:搜寻专家 更新时间:2023-10-30 21:36:00 32 4
gpt4 key购买 nike

我在 ListFragment(位于 ViewPager 内)中有一个 CursorLoader 用于查询数据库。我有一个该数据库的内容提供者,我已经验证了它的工作原理。

问题是这样的:当应用程序首次运行时,一个单独的服务会调用 ContentProvider 中的批量insert:

public int bulkInsert(Uri uri, ContentValues[] values) {
if(LOGV) Log.v(TAG, "insert(uri=" + uri + ", values" + values.toString() + ")");

final SQLiteDatabase db = openHelper.getWritableDatabase();
final int match = uriMatcher.match(uri);

switch(match) {
case SNAP: {
db.beginTransaction();
for(ContentValues cv : values) {
db.insertOrThrow(Tables.SNAP, null, cv);
}
db.setTransactionSuccessful();
db.endTransaction();

getContext().getApplicationContext().getContentResolver().notifyChange(uri, null);
return values.length;
}

列表 fragment 中的 CursorLoader 在第一次运行时(创建数据库时)返回 0 行。如果我关闭并重新启动应用程序,则 CursorLoader 会很好地工作并返回我需要的内容。我试图通过处理程序实现等待,但似乎无济于事。这是使用 CursorLoaderListFragment:

public class DataBySnapFragment extends ListFragment implements LoaderCallbacks<Cursor> {   
public static final String TAG = "DataBySnapFragment";

protected Cursor cursor = null;
private DataBySnapAdapter adapter;

private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
Log.d(TAG, "RELOADING!!!!!");
onLoadDelay();
}
};

@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Log.d(TAG, "onActivityCreated");

adapter = new DataBySnapAdapter(getActivity(),
R.layout.list_item_databysnap,
null,
new String[]{},
new int[]{},
0);
setListAdapter(adapter);
getLoaderManager().initLoader(0, null, this);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_databysnap, null);
return view;
}

@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("error_workaround_1",
"workaroundforerror:Issue 19917,
http://code.google.com/p/android/issues/detail?id=19917");
}

@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
CursorLoader cursorLoader = new CursorLoader(getActivity(),
Snap.CONTENT_URI,
null,
null,
null,
Snap.DATA_MONTH_TO_DATE + " DESC LIMIT 6");

return cursorLoader;
}

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
Log.d(TAG, "data rows: " + data.getCount());
if(data.getCount() <= 0) {
delayThread();
} else {
adapter.swapCursor(data);
}
}

@Override
public void onLoaderReset(Loader<Cursor> loader) {
adapter.swapCursor(null);
}

private void onLoadDelay() {
getLoaderManager().initLoader(0, null, this);
}

private void delayThread() {
new Thread() {
public void run() {
longTimeMethod();
handler.sendEmptyMessage(0);
}
}.start();
}

private void longTimeMethod() {
try {
Thread.sleep(12000);
} catch (InterruptedException e) {
Log.e("tag", e.getMessage());
}
}
}

任何人都可以告诉我为什么会发生这种情况,或者至少引导我朝着正确的方向前进吗?谢谢!

最佳答案

除非您正在拖延主线程,否则创建一个新线程并告诉它休眠不会真正解决任何问题。

我真的不能说到底哪里出了问题,但听起来您可能需要刷新数据。要进行测试,您可以尝试制作一个带有刷新数据内容的 OnClickListener 的按钮,然后从数据库中重新拉取它。

关于android - CursorLoader 不显示数据库条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9265164/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com