Android SQLite数据库在活动之间共享

10
什么是在多个活动之间共享SQLite DB的最佳方法?DB中的表格显示在ListView中,并且还要执行删除/插入记录。我听说过服务,但没有找到适用于我的问题的示例。现在我有一个SQLiteOpenHelper类来打开DB。我在OnPause()中关闭DB,并在onResume()中打开它。但我无法从子活动向DB插入数据,出了些问题。
2个回答

20
为您的应用程序创建一个Application类。只要您的应用程序的任何部分在运行,它就会保持活动状态。您可以在onCreate方法中创建您的DB,并在onTerminate方法中清理它。(请注意,不能保证onTerminate将被调用,因此您在这里所依赖的内容应该小心。但是,由于SQLite数据库只是一个文件,并且被积极刷新,关闭操作只是一种礼貌而不是必需品。)
您可以通过"getApplication"从任何Activity访问应用程序,因此DB将始终对您可用。
有关更多信息,请参见http://developer.android.com/guide/appendix/faq/framework.html#3
更新:
根据要求,这里提供了一个使用getApplication的示例。它真的非常简单。
  SQLiteDatabase mDB;
  @Override protected void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mDB = ((MyApplication)getApplication()).mDB;
  }

如果每个活动都包含此代码,则每个活动将拥有其自己的mDB字段,该字段引用相同的基础共享数据库对象。

1
所有的活动、服务等都使用同一个事件线程,因此不存在同步问题的风险。您应该在活动中使用“startManagingCursor”来管理适配器所使用的任何游标,以便在从一个活动转移到另一个活动时它们将被停用并重新查询。 - beekeeper
1
是的。使用SQLiteOpenHelper更为常见。这种方法可以处理任何类型的共享资源。(唯一的例外情况是如果您需要保证终止。由于onTerminate无法保证被调用,因此您无法真正在确保终止的同时进行真正的共享。相反,您应该在退出和进入每个后续活动时保存并重新创建对象。幸运的是,您不会遇到太多这样的情况。) - beekeeper
Mighter:我找到了这篇文章。是的,你可以在应用程序类中初始化全局SQLiteOpenHelper处理程序。SQLiteOpenHelper的构造函数需要一个上下文,通常是活动上下文。在这种情况下,只需将应用程序上下文传递给它即可。 - Tim Wu
这是否意味着只要应用程序处于打开状态,数据库对象就一直保持打开状态?这样做是否会对系统资源造成不必要的压力?每次需要时开启和关闭数据库是否不更好? - ygesher
那个链接获取更多信息的已经失效了。 - zygimantus
显示剩余2条评论

3
你可以通过实现一个BaseActivity类并将其扩展到应用程序中的所有Activity类来实现此功能:
public class BaseActivity extends Activity {

    protected static SQLiteOpenHelper database;

    @Override
    protected void onPause() {

            // TODO close database

            super.onPause();
    }

    @Override
    protected void onResume() {

            super.onResume();

            // TODO open database
    }
}




public class OneSubActitivy extends BaseActivity {

    // methods using database from BaseActivity
}

实现基础活动和为每个活动实现onResume和onPause之间有什么区别? - user468311
只需在BaseActivity中实现一次代码。您必须在基类中编写所有活动的公共代码... - caligari

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接