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

mic*_*lli 44 android android-fragments android-cursoradapter

我在我的项目中使用Android兼容性库.我已经按照DevGuide(http://developer.android.com/reference/android/app/Fragment.html)中的描述设置了ListFragment ,并且使用了一个简单的CursorLoader Christian而没有内容提供者(没有ContentProvider的CursorLoader用法)).

问题是,在我的ListFragment/parent Activity中,我应该打开数据库,返回Cursor,创建Adapter和setListAdapter?

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

是最好的做法......

  • 在ListFragment中打开数据库并在ListFragment中onActivityCreated关闭它,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();
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)
  • 查询数据库并返回光标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);
        }
    }
    
    Run Code Online (Sandbox Code Playgroud)

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

Thi*_*rry 6

抱歉没有CursorLoader和Fragment的经验,但我已经在不同线程和活动的并发访问环境中使用了SQLiteOpenHelper.

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

我做了什么:

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

至少这是有效的,在具有数千个用户的应用程序中没有崩溃.欢迎提出改进的建议:-)