不同活动中的数据库操作顺序

时间:2014-08-19 09:08:10

标签: android database android-sqlite

我有两项活动,比如说ActivityAActivityB,顺序为:

ActivityA - > ActivityB

现在两个活动都将读取和写入相同的数据库,当ActivityB目的地,我将最后一个状态保存到数据库,然后当用户返回ActivityA时,我将重新加载状态形成数据库。

但是我发现read中的ActivityA操作始终在write中的ActivityB操作之前完成:

class ActivityB{
    @Override
    protected void onDestroy() {
        ....
        mDao.update(mItem);
        System.out.println("pro:save:" + mItem.name + ":" + mItem.progress);
//      mDatabase.close();
        super.onDestroy();
    }
}

class ActivityA{
    @Override
    protected void onResume() {
        super.onResume();
        mLocalDbLoadTask = new LocalDbLoadTask();
        mLocalDbLoadTask.execute(mItem);
    }
    class LocalDbLoadTask extends AsyncTask<Item, Void, Item> {

        @Override
        protected Item doInBackground(Item... Items) {
            Item item = Items[0];
            mItemDao.fill(item);
            return null;
        }

        @Override
        protected void onPostExecute(Item Item) {
            System.out.println("pro:load:" + mItem.name + ":" + mItem.progress);
        }
    }
}

我总是得到:

08-19 03:04:45.730    4757-4757/com.kk I/System.out﹕ pro:load:name xx:11
08-19 03:04:46.094    4757-4757/com.kk I/System.out﹕ pro:save:name xx:14

这意味着如果项目在ActivityA更新,则ActivityB无法获取项目的最新状态(示例中为14)。

问题是什么?


更新

将代码保存从onDestory移至onPause后,订单是正确的,但有时我仍然得到错误的值:

08-19 03:30:00.170    5330-5330/com.kk I/System.out﹕ pro:save:xx:16
08-19 03:30:00.214    5330-5330/com.kk I/System.out﹕ pro:load:xxx:null

如图所示16已保存在ActivityB中,null已保存在ActivityA中。

1 个答案:

答案 0 :(得分:1)

我认为,问题是活动生命周期。

  

onPause()在系统即将开始恢复上一个活动时调用。
  onStop()当活动不再对用户可见时调用,因为另一个活动已经恢复并且正在覆盖此活动。
  onDestroy()在您的活动被销毁之前收到的最终通话。

一般情况下,订单应为ActivityB.onPause() - &gt; ActivityA.onResume() - &gt; ActivityB.onStop() - &gt; ActivityB.onDestroy()。您可以通过onResume()onPause()onDestroy()方法拨打日志来进行检查。

因此,只需在ActivityB的onPause()方法中写入对数据库的更改。

Activity Lifecycle