SQLiteDatabase 对象被作为 Null 传递,即使在构造函数中初始化时也是如此

SQLiteDatabase Object being passed as Null, even when Initialised at Constructor

过去几天我在这方面遇到了错误,尝试使用断点来弄清楚为什么它会给出空指针异常,但我无法理解哪个值被卡住了。我怎样才能使 db 不为空,以便 运行 这段代码。 我有一个抽象 class 在某些条件语句上调用此方法。它必须 return 一个长值。哪个用于其他方法。

此方法长保存在另一个 class 中实现,其中 return 在调用 db.insert 后是一个值,但我收到空指针异常

java.lang.NullPointerException: Attempt to invoke virtual method 'long android.database.sqlite.SQLiteDatabase.insert(java.lang.String, java.lang.String, android.content.ContentValues)' on a null object reference

我有以下疑问:

  1. 为什么当我在 Fragment 中使用它时出现错误,但是当我使用 Activity 时它工作正常。可能是什么原因。
  2. 此外,当我将 db 作为参数传递时,如何调用 getWritableDatabase。

    long save(SQLiteDatabase db) {
    
    
            ContentValues cv = new ContentValues();
            long now = System.currentTimeMillis();
            cv.put(COL_CREATEDTIME, now);
            cv.put(COL_MODIFIEDTIME, now);
            //cv.putNull(COL_MODIFIEDTIME);
            cv.put(COL_NAME, name==null ? "" : name);
            //if (fromDate != null)
            cv.put(COL_FROMDATE, fromDate==null ? "" :fromDate);
            //if (toDate != null)
            cv.put(COL_TODATE, toDate==null ? "" :toDate);
            //if (rule != null)
            cv.put(COL_RULE, rule==null ? "" :rule);
            //if (interval != null)
            cv.put(COL_INTERVAL, interval==null ? "" :interval);
            cv.put(COL_SOUND, sound ? 1 : 0);
            //if (sound != null)
    
            //Log.e(TAG, "Error inserting " + now);
            return db.insert(TABLE_NAME,null, cv);}
    

public class DosageDB extends Application {


    public static DBHelper dbHelper;
    public static SQLiteDatabase db;

    public static final String TIME_OPTION = "time_option";
    public static final String DATE_RANGE = "date_range";
    public static final String DATE_FORMAT = "date_format";
    public static final String TIME_FORMAT = "time_format";
    public static final String VIBRATE_PREF = "vibrate_pref";
    public static final String RINGTONE_PREF = "ringtone_pref";

    public static final String DEFAULT_DATE_FORMAT = "yyyy-M-d";

    @Override
    public void onCreate() {
        super.onCreate();

        PreferenceManager.setDefaultValues(this,R.xml.settings, false);
        sp = PreferenceManager.getDefaultSharedPreferences(this);

        dbHelper = new DBHelper(this);
        db = dbHelper.getWritableDatabase();


    }
}

堆栈跟踪:

09-10 15:05:39.582    2423-2423/healerkart.com.dosage E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: healerkart.com.dosage, PID: 2423
    java.lang.NullPointerException: Attempt to invoke virtual method 'long android.database.sqlite.SQLiteDatabase.insert(java.lang.String, java.lang.String, android.content.ContentValues)' on a null object reference
            at healerkart.com.dosage.Delta.Alarm.save(Alarm.java:65)
            at healerkart.com.dosage.Delta.AbstractModel.persist(AbstractModel.java:54)
            at healerkart.com.dosage.Delta.Alarm.persist(Alarm.java:10)
            at healerkart.com.dosage.Alpha.dosageFrag.onClick(dosageFrag.java:134)
            at android.view.View.performClick(View.java:4780)
            at android.view.View$PerformClick.run(View.java:19866)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5257)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

由于 DosageDB 正在扩展应用程序,我忘记在 AndroidManifest.xml 中提及应用程序名称属性 无论如何谢谢。