我是Android开发的新手(总体来说是坦率的开发),因此我一直在阅读Commonsware Busy Coder的指南。在阅读SQLite部分时,有一些事情对我来说并不是100%。以下是我认为正在发生的事情以及一些问题。如果我在思考过程中出错,请纠正我。
作者建议,如果要在应用程序中使用多于一个Activity的数据库,则不应使用每个Activity的Context引用来实例化 SQLiteOpenHelper 。相反,您应该使用Activity提供的getApplicationContext()
。
通过这样做,他使用getApplicationContext()
检索应用程序进程开始后不久创建的Context的单例实例的事实。这是我的问题出现的地方。我想如果我在实例化 SQLiteOpenHelper 时使用Activity(this关键字)提供的Context,每个Activity都会创建自己的 SQLiteOpenHelper 实例。在我看来,仅使用Activity的Context不会通知Application Context已经创建了一个SQLiteHelper实例,因此,它创建一个新实例而不是重用现有实例。我的想法是否正确?
我认为Context(并在我错了时纠正我)作为开发者获取Android OS提供的信息和资源的“网关”(即通过getSystemService()
获取系统服务)。但是使用此(来自活动)或使用getApplicationContext()
这样做会产生不同的含义。使用它,将获得一个Context的实例,它对您当前的Activity是“本地的”,但使用getApplicationContext()
引用整个应用程序。如果这是正确的,这是否意味着当我将getApplicationContext()
的引用传递给 SQLiteOpenHelper的构造函数时,它将让我的整个应用程序知道我的 SQLiteOpenHelper <的实例/ strong>已创建。 SQLiteOpenHelper 如何让应用程序了解这一点?它是否使用一些静态方法,如public / private static dbCreated(Context context){//让上下文知道有一个运行的实例}让应用程序知道吗?
如果这令人困惑,我很抱歉。
提前致谢
答案 0 :(得分:5)
我认为现在我对Context的概念有了更好的理解。我想分享一个我发现澄清这个主题的链接。 http://t.co/9R0bPWiKc5
答案 1 :(得分:2)
对于你的第二个问题,如果我理解正确,上下文就是某种Registry of Singletons。因此, SQLiteOpenHelper 刚刚创建并绑定到给定的上下文。使用此上下文获取 SQLiteOpenHelper 的所有内容都将获得该绑定实例。