【问题标题】:Android increasing database performanceAndroid 提高数据库性能
【发布时间】:2014-03-17 07:40:58
【问题描述】:

好吧,我有一个列表视图,如果单击列表视图元素,则会打开一个 Viewpager 以显示内容。

listview 和 Viewpager 都是来自数据库的同一个适配器。

问题是:viewpager 打开时需要创建相同的列表适配器才能使用。 如何在不重复创建的情况下将 Listview 的列表用于 viewpager。

我从 Big Nerd 的书中获取这些代码:

这是列表片段:

public class framelist extends ListFragment {
@Override
    public void onCreate(Bundle savedInstanceState) {
        TestAdapter mDbHelper = new TestAdapter(getActivity());
        mDbHelper.createDatabase();
        mDbHelper.open();
        List<element> mElements = mDbHelper.getTestData();

这是 Viewpager FragmentActivity

public class CrimePagerActivity extends FragmentActivity {
@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        mViewPager = new ViewPager(this);
        mViewPager.setId(R.id.viewPager);
        setContentView(mViewPager);

        TestAdapter mDbHelper = new TestAdapter(this);
        mDbHelper.createDatabase();
        mDbHelper.open();
        mElements = mDbHelper.getTestData();

这是 Viewpager 片段:

public class CrimeFragment extends Fragment {
@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setHasOptionsMenu(true);
        mNum2 = (int) getArguments().getInt("num");

        TestAdapter mDbHelper = new TestAdapter(getActivity());
        mDbHelper.createDatabase();
        mDbHelper.open();
        List<element> mElements = mDbHelper.getTestData();
        melement = mElements.get(mNum2);

【问题讨论】:

    标签: android database android-fragments android-listview database-performance


    【解决方案1】:

    我建议您使用Loader 框架来查询事物。如果不出意外,请参阅my answer to similar question,它提供了一些非常相关的链接,可以帮助您进行案例研究。

    还有一个提示:如果您只是使用简单的方法,即“通过 OpenSqliteDbHelper 实例从您的 Activity 查询数据库”,那么您必须 非常小心并注意您的应用生命周期和Cursor's 生命周期管理。当然,如果您使用这种方法,提高性能是非常困难的。如果您使用建议的 Loader 方法,所有这些问题都会像魔术一样消失,因为它会保留有关配置更改的数据,您不必一次又一次地查询数据。

    另一个提示:如果您选择使用直接(即不使用Loader)方法,请确保在单独的线程上查询您的数据。这样可以防止您的 UI 被冻结。

    类似问题已在此处提出并回答,如果没有其他问题,请使用搜索

    【讨论】:

      【解决方案2】:

      你想通过在列表和 viewpager 中显示相同的内容来实现什么

      无论如何,在您的CrimePagerActivity 中,与其重新创建列表,不如将内容复制到列表中

      List<element> newList = mDbHelper.getTestData();
      mElements.clear();
      mElements..addAll(newList);
      

      还有一个建议,您的主题说提高数据库性能,但您正在询问有关列表的所有内容

      遵循 DB 的单例模式,不要每次都创建新的 DB,并确保您同步任何对 db 的调用

      【讨论】:

      • 为了获得更好的 sqlite 性能,请查看 sqlite 上的batch processing
      • 当然我使用的是单例,问题是我如何使用已经从列表视图和 Viewpager 中的数据库创建的列表。但是您的方法可以改进,复制列表?
      • 你不能将相同的列表引用传递给列表以及片段
      • 还没有,如果我尝试复制,每次我的列表返回空,那么如何调用使用 List 创建的 ListFragment 列表 mElements = mDbHelper.getTestData();从 viewpager 无需再次创建
      • 如果您仍在使用相同的代码,那么您可能会在每个片段中创建新的数据库,因此请确保在查询数据库之前有一些数据。您可以将数据库放到您的桌面并验证数据是否存在
      猜你喜欢
      • 2023-03-08
      • 1970-01-01
      • 1970-01-01
      • 2011-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-24
      • 2017-05-23
      • 2010-10-01
      相关资源
      最近更新 更多