嗨,我在服务中使用广播接收器来获取消息并在数据库中更新它。我成功地收到了消息,但我的问题是,当它试图在活动被破坏时插入数据库时(但更新是在应用程序运行时发生的),它显示以下错误
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'android.database.sqlite.SQLiteDatabase android.content.Context.openOrCreateDatabase(java.lang.String, int, android.database.sqlite.SQLiteDatabase$CursorFactory, android.database.DatabaseErrorHandler)' on a null object reference
05-13 04:01:46.896 4171-4171/com.example E/AndroidRuntime: at android.content.ContextWrapper.openOrCreateDatabase(ContextWrapper.java:274)
05-13 04:01:46.896 4171-4171/com.example E/AndroidRuntime: at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:223)
05-13 04:01:46.896 4171-4171/com.example E/AndroidRuntime: at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:163)
05-13 04:01:46.896 4171-4171/com.example E/AndroidRuntime: at com.scanlibrary.DbHandler.addImage(DbHandler.java:132)
我展示了我的一些代码广播接收机:
public static class ReceiveSms extends BroadcastReceiver {
public ReceiveSms(){
super();
}
private static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
@Override
public void onReceive(Context context, Intent intent) {
// receive message
MainActivity mainActivity = new MainActivity();
mainActivity.upDateMessage(message);
}
}
在MainActivity.class:中
public void upDateMessage(String message){
DbHandler db = new DbHandler(this,null,null,1);
db.addImage(message);
}
在我的DbHandler.class:中
//构造函数
public DbHandler(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, DATABASE_NAME, factory, DATABASE_VERSION);
}
public void addImage(CroppedImageClass cic){
ContentValues values = new ContentValues();
// do some editing
try{
SQLiteDatabase db = this.getWritableDatabase();
db.insert(TABLE_IMAGE, null, values);
db.close();
}catch (NullPointerException npe){
}
}
我在谷歌上搜索了一下,但没有找到解决问题的办法。如有任何帮助,我们将不胜感激,并提前感谢
您永远不应该实例化活动
MainActivity mainActivity = new MainActivity();
这个对象不是任何生命周期的一部分,更不用说以任何方式设置为上下文了。
如果您想要一个活动或服务来处理您的数据库操作,则需要为此创建一个意图,并调用context.startActivity(intent)
或context.startService(intent)
。该消息可以作为意图的附加内容添加。
如果你做了类似的事情
public DbHandler(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, DATABASE_NAME, factory, DATABASE_VERSION);
}
删除不使用的参数。构造函数
public DbHandler(Context context, SQLiteDatabase.CursorFactory factory) {
super(context, DATABASE_NAME, factory, DATABASE_VERSION);
}
就足够了。