0

こんにちは私はサービスで放送受信機を使用してメッセージを取得し、dbで更新しています。私はのいくつかを示して、それがサービスからデータベースに挿入しようとしたときにAndroid sqlliteデータベースロックが発生しました

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) 

次のエラーを示して私は正常にメッセージを受信するが、それは活動が破壊された場合、DBに挿入しようとするこれまでのとき、私の問題がある(ただし、アプリが実行されている場合、更新が起こっています)私のコード Broadcastreceiver:MainActivity.classで

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

:私のDbHandler.classで

public void upDateMessage(String message){ 
    DbHandler db = new DbHandler(this,null,null,1); 
    db.addImage(message); 
} 

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で検索さが、私は私の問題を解決するための解決策を見つけていませんでした。すべてのヘルプは、あなたが活動

MainActivity mainActivity = new MainActivity(); 

をインスタンス化することはありません感謝し、事前

+0

あなたがデータベース名を宣言していないので、 'DbHandler'クラスを投稿してください。NPE'を取得します。 –

+0

これはコンストラクタでデータベース名を直接指しているのでnull値を渡しているだけです。 – Karthik

答えて

0

で感謝されます。このオブジェクトは、任意のライフサイクルの一部、ましてやコンテキストとして設定どのような方法ではありません。

データベース操作を処理するアクティビティまたはサービスを作成するには、その目的を作成し、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); 
} 

で十分です。

+0

インテントを使用しますが、自動的にアクティビティを開始しますが、使用したアクティビティを開始したくありません。インテントintent1 =新しいインテント(context、MainActivity.class); intent1.putExtra( "message"、content); の代わりにintent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); context.startActivity(intent1);アクティビティをインスタンス化する代わりに – Karthik

+0

サービスを使用しないのはなぜですか? – tynn

+0

はいサービスでのみ使用しています。私はブロードキャスト受信機を使用しました。 – Karthik

関連する問題