【发布时间】:2013-03-10 22:23:31
【问题描述】:
我是 Android 开发新手(坦率地说,我是整体开发新手),因此我一直在阅读 Commonsware Busy Coder 的指南。在阅读 SQLite 部分时,有几件事对我来说不是 %100 清楚的。以下是我认为正在发生的事情以及一些问题。如果我的思维过程有误,请纠正我。
作者建议,如果您要在应用程序中使用多个 Activity 的数据库,则不应使用每个 Activity 的 Context 引用来实例化 SQLiteOpenHelper。相反,您应该使用 Activity 提供的getApplicationContext()。
通过这样做,他利用getApplicationContext() 检索应用程序进程开始后不久创建的 Context 的单例实例这一事实。这就是我的问题出现的地方。我认为如果在实例化SQLiteOpenHelper时使用Activity提供的Context(this关键字),每个Activity都会创建自己的SQLiteOpenHelper实例。在我看来,仅使用 Activity 的上下文并不会通知应用程序上下文已经创建了 SQLiteHelper 的实例,因此,它创建了一个新实例而不是重新使用现有实例。我的想法对吗?
我认为 Context(如果我错了,请纠正我)作为开发人员获取 Android 操作系统提供的信息和资源的“网关”(即通过getSystemService() 获取系统服务)。但是使用 this(来自 Activity)或使用 getApplicationContext() 这样做有不同的含义。使用它,将获得一个 Context 的实例,它是您当前活动的“本地”,但使用 getApplicationContext() 引用整个应用程序。如果这是正确的,这是否意味着当我将对 getApplicationContext() 的引用传递给 SQLiteOpenHelper 的 构造函数时,它会让我的整个应用程序知道我的 SQLiteOpenHelper的实例> 已经创建。 SQLiteOpenHelper 如何让应用程序知道这一点?它是否使用一些静态方法,如 public/private static dbCreated(Context context){//让上下文知道有一个正在运行的实例}让应用程序知道?
如果这令人困惑,我很抱歉。
提前感谢
【问题讨论】:
-
问题是什么?
-
很抱歉,如果它令人困惑。问题在第三和第四段的末尾。
-
确实如此。我正在寻找一个可以在 SO 范围内回答的问题。到目前为止,您的范围太广了。
-
我要问的是我的思维过程是否正确。为什么当我使用 Activity 自己的上下文来实例化数据库助手类时,Android 每次都会创建一个新实例,而当我使用 getApplicationContext() 时它只创建一个。对困惑感到抱歉。这是我的第一篇文章...
-
因为 appContext 是整个应用程序的单个实例(如单例)
标签: sqliteopenhelper android-context