【问题标题】:Passing Context to SQLiteOpenHelper将上下文传递给 SQLiteOpenHelper
【发布时间】:2014-10-15 21:10:58
【问题描述】:

首先,我是 android 应用程序的新手,并没有独自工作。我的队友在我处理这个的时候做了设计,让我设置数据库和方法等等。

因此,尽管大部分内容似乎都还可以,但我提出:

Context context = null;
DataBaseHelper drinksDataBase = new DataBaseHelper(context); 

进入他的主要活动。

构造函数如下:

public DataBaseHelper(Context  context) {

    super(context, DB_NAME, null, 1);
    this.myContext = context;
    try{
        createDataBase();
    }
    catch(IOException e){

    }
}

忽略 null,我假设它是应用程序崩溃的当前原因,我将如何为应用程序获取正确的上下文,以便我可以使我的数据库正常工作?

它实际上似乎在this.getReadableDatabase() 上崩溃了,所以我不知道这是否是空上下文。

Logcat 无法启动,原因是:

[2012-10-12 10:37:57 - Unexpected error while launching logcat. Try reselecting the device.] device not found
com.android.ddmlib.AdbCommandRejectedException: device not found
    at com.android.ddmlib.AdbHelper.setDevice(AdbHelper.java:752)
    at com.android.ddmlib.AdbHelper.executeRemoteCommand(AdbHelper.java:373)
    at com.android.ddmlib.Device.executeShellCommand(Device.java:462)
    at com.android.ddmuilib.logcat.LogCatReceiver$1.run(LogCatReceiver.java:109)
    at java.lang.Thread.run(Unknown Source)  

提前致谢,

詹姆斯

【问题讨论】:

    标签: android sqliteopenhelper


    【解决方案1】:

    这是我通常做的:

     public class MyApplication extends Application {
        private static MyApplication  instance;
        public MyApplication()
        {
           instance = this;
        }
        public static Context getContext()
        {
           return instance;
        } 
    

    然后将该类设置到清单中

     <application
            android:name="my.workspace.MyApplication"
    ...
     >
    

    之后只需拨打MyApplication.getContext(),您需要的地方。

    【讨论】:

      【解决方案2】:

      如果您使用的是 eclipse,那可不是儿戏。只需在某个“私有上下文上下文”中创建一个字段,然后您就可以从源选项卡中的字段生成构造函数。只为你吐出来。然后,当您需要创建该类的实例时。通常参数中的“this”就足够了

      编辑


      我希望这会有所帮助,我不想在这里延长讨论。 在您的数据库中:

      public DataBaseHelper(Context  context) {
          super(context, DB_NAME, null, 1);
      }
      
      public Cursor getDrinks() {
              SQLiteDatabase db = getReadableDatabase();
              Cursor cursor = db.query(DB_NAME, null, null, null, null, null, null);
              return cursor;
          }
      

      然后在您的活动中(在 oncreate 中):

      private Cursor c;
      
      ...
      DataBaseHelper drinksDataBase = new DataBaseHelper(this);
      c = drinksDataBase.getDrinks(); 
      c.moveToFirst();
      

      【讨论】:

      • Context上下文字段在DataBaseHelper类里面,我只需要在那个类外面,这样我就可以把它放到这个类里了。您的建议是否适用?
      • 嗯,这确实给了我一个上下文,谢谢,但它仍然在 getReadableDatabase() 上崩溃,所以我猜这不是导致崩溃的空值,是吗?
      • 对不起,我想我没有完美地回答问题。如果上下文在您的数据库类构造函数中设置得很好,那么您只需要正确地将它放入您的参数中吗?如果您在 oncreate 中实例化 - 然后 DataBaseHelper DrinkDataBase = new DataBaseHelper(this);是你所需要的全部。但是如果你在一些内部事件处理程序中,那么你可能需要 DataBaseHelper DrinkDataBase = new DataBaseHelper(ClassName.this); “上下文上下文=空;”对于这个特定的过程什么都不做,你也不应该把它留为空。
      • 如果你遇到了崩溃,你应该至少发布 logcat 或一些代码,我不知道发生了什么。除非正在使用该空值,否则不会导致崩溃。但无论如何,那不应该在那里。
      • 对此我感到很痛苦,我深表歉意,但我确实对 android 有相当基本的了解,自从我完成 java 以来大约一年左右。我将把构造函数放在我的第一篇文章中,你能告诉我它是否符合你的想法吗?
      猜你喜欢
      • 2020-06-25
      • 2018-03-05
      • 1970-01-01
      • 2013-09-10
      • 2018-03-25
      • 2017-03-28
      • 2011-10-27
      • 2016-11-20
      • 1970-01-01
      相关资源
      最近更新 更多