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

我在我的项目中使用Android兼容性库。 我已经设置了如DevGuide( http://developer.android.com/reference/android/app/Fragment.html )中所述的ListFragment,并使用一个简单的CursorLoader基督教使用没有内容提供者( CursorLoader使用没有ContentProvider )。

问题是 ,在我的ListFragment /父活动,我应该打开数据库,返回光标,创build适配器和setListAdapter?

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

是最好的做法…

  • 在ListFragment的onActivityCreated打开数据库,并在ListFragment的onDestroyclosures它,如下面的代码示例

     @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创buildAdapter和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的经验,但是我已经在不同线程和活动的并发访问的上下文中经历了SQLiteOpenHelper的使用。

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

我做了什么:

  • 将SQLiteOpenHelper定义为应用程序范围的单身人士,而不是像你似乎做的那样广泛的活动
  • 在Application onCreate中实例化SQLiteOpenHelper单个实例
  • 不要在任何活动onDestroy中释放SQLiteOpenHelper实例,因为活动停止时,另一个可能仍然需要打开DB
  • 我猜SQLiteOpenHelper实例应该在应用程序onTerminate清除(不确定,因为onTerminate实际上几乎从来没有调用)
  • 我有DBAdapter对象,它使用mySQLiteOpenHelper.getWritableDatabase()获取SQLiteDatabase引用
  • 这些DBAdapter通常分配在onCreate活动中,并在onDestroy中发布

至less这是有效的,在几千个用户的应用程序中没有崩溃。 改进的build议,欢迎:-)