gpt4 book ai didi

android - 使用 CursorLoader 在 ListFragment 中查询 SQLite 数据库的最佳实践?

转载 作者:IT王子 更新时间:2023-10-28 23:53:10 24 4
gpt4 key购买 nike

我在我的项目中使用 Android 兼容性库。我已经按照 DevGuide (http://developer.android.com/reference/android/app/Fragment.html) 中的描述设置了 ListFragment,并使用了一个简单的 CursorLoader Christian,它可以在没有内容提供程序的情况下使用 (CursorLoader usage without ContentProvider)。

问题是,在我的 ListFragment/父 Activity 中,我应该在哪里打开数据库、返回光标、创建 Adapter 和 setListAdapter?

所以在我的应用中,我有 TitlesFragment、DetailsFragment、FragmentLayoutActivity、DetailsLayoutActivity。

是最佳实践吗...

  • 在 ListFragment 的 onActivityCreated 中打开数据库并在 ListFragment 的 onDestroy 中关闭它,如下面的代码示例所示

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    // Open database
    playersDatabaseHelper = new PlayersDBAdapter(getActivity());
    playersDatabaseHelper.open();
    getLoaderManager().initLoader(0, null, this);
    ...
    }

    @Override
    public void onDestroy() {
    super.onDestroy();
    if (playersDatabaseHelper != null) {
    playersDatabaseHelper.close();
    }
    }
  • onCreateLoader中查询数据库并返回光标,在onLoadFinished中创建Adapter和setListAdapter,如下面的代码示例

    @Override
    public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    // Now create and return a CursorLoader that will take care of
    // creating a Cursor for the data being displayed.
    return new MyCursorLoader(getActivity()) {
    @Override
    public Cursor loadInBackground() {
    playersCursor = playersDatabaseHelper.getAllPlayers();
    return playersCursor;
    }
    };

    }

    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
    // Create an empty adapter we will use to display the loaded data.
    playersAdapter = new RowAdapter(getActivity(), playersCursor, R.layout.players_overview_row);

    // Allocate the adapter to the List displayed within this fragment.
    setListAdapter(playersAdapter);

    playersAdapter.swapCursor(cursor);

    // The list should now be shown.
    if (isResumed()) {
    setListShown(true);
    } else {
    setListShownNoAnimation(true);
    }
    }

我是在正确的轨道上还是应该将其中的一些移到某个地方?感谢您的宝贵时间!

最佳答案

抱歉,还没有使用 CursorLoader 和 Fragment 的经验,但我已经体验过在不同线程和 Activity 的并发访问上下文中使用 SQLiteOpenHelper。

我假设 PlayersDBAdapter 在内部使用 SQLiteOpenHelper 类。但不清楚你的方法 open() 和 close() 是做什么的?

我做了什么:

  • 将您的 SQLiteOpenHelper 定义为 应用程序 范围的单例,而不是像您看起来那样的 Activity 范围
  • 在您的 Application onCreate 中实例化 SQLiteOpenHelper 单个实例
  • 不要在任何 Activity onDestroy 中释放 SQLiteOpenHelper 实例,因为当 Activity 停止时,另一个 Activity 可能仍需要打开数据库
  • 我猜 SQLiteOpenHelper 实例应该在应用程序 onTerminate 中被清除(不确定因为 onTerminate 实际上几乎从未调用过)
  • 我有 DBAdapter 对象,它通过 mySQLiteOpenHelper.getWritableDatabase() 获取 SQLiteDatabase 引用
  • 这些 DBAdapter 通常在 Activity onCreate 中分配并在 onDestroy 中释放

至少这是可行的,在拥有数千名用户的应用程序中没有崩溃。欢迎提出改进建议:-)

关于android - 使用 CursorLoader 在 ListFragment 中查询 SQLite 数据库的最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7581593/

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