尝试从服务插入数据库时​​发生Android sqllite数据库锁定

时间:2016-05-13 06:20:40

标签: android sqlite android-service android-broadcastreceiver

您好我正在使用广播接收器来获取消息并在db中更新它。我成功收到消息,但我的问题是当活动被销毁时尝试插入db(但是当应用程序运行时发生更新),它显示以下错误

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){

    }
}

我搜索了Google,但我没有找到解决问题的解决方案。任何帮助将不胜感激,并提前感谢

1 个答案:

答案 0 :(得分:0)

您永远不应该实例化活动

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);
}

就足够了。