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
我有以下疑问:
- 为什么当我在 Fragment 中使用它时出现错误,但是当我使用 Activity 时它工作正常。可能是什么原因。
此外,当我将 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 中提及应用程序名称属性
无论如何谢谢。
过去几天我在这方面遇到了错误,尝试使用断点来弄清楚为什么它会给出空指针异常,但我无法理解哪个值被卡住了。我怎样才能使 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
我有以下疑问:
- 为什么当我在 Fragment 中使用它时出现错误,但是当我使用 Activity 时它工作正常。可能是什么原因。
此外,当我将 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 中提及应用程序名称属性 无论如何谢谢。