【问题标题】:Deciding between Activity Context or Application Context to Instantiate SQLiteOpenHelper在 Activity 上下文或应用程序上下文之间决定实例化 SQLiteOpenHelper
【发布时间】: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


【解决方案1】:

我想我现在对上下文的概念有了更好的理解。我想分享一个我发现的链接来阐明这个主题。 http://t.co/9R0bPWiKc5

【讨论】:

    【解决方案2】:

    对于你的第二个问题,如果我理解正确的话,上下文是某种Registry of Singletons。所以 SQLiteOpenHelper 只是被创建并绑定到给它的上下文。使用此上下文获取 SQLiteOpenHelper 的所有内容都将获得该绑定实例。

    【讨论】:

    • 感谢您的信息。 +1。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-10
    • 1970-01-01
    • 1970-01-01
    • 2019-09-08
    • 1970-01-01
    • 2014-01-30
    相关资源
    最近更新 更多