0

私はAndroidで非常に確実にコーディングしようとしているので、dbとの接続用の別のクラス、テーブルの作成、挿入更新と削除用のクラスなど、さまざまな目的のためにさまざまなクラスを作成しました。現在、SQLiteDatabase [mDb] で問題が発生しています。テーブル列、つまり recipient.class のゲッターとセッターがあるクラスがありました。ここで、データベースにデータを挿入する必要があるため、挿入のために次のようにしました。

public long insert(Recipient recipient, String[] images){
        ContentValues initialValues = new ContentValues();
        initialValues.put(FLD_RECIPIENT_ID, Recipient.getFldRecipientId());
        initialValues.put(FLD_INFO, Recipient.getFldInfo());
        initialValues.put(FLD_LATITUDE, Recipient.getFldLatitude());
        initialValues.put(FLD_LONGITUDE, Recipient.getFldLongitude());
        for(int i=0;i<images.length;i++){
            if(images[i]!=null){
                initialValues.put("FLD_IMAGE_URL"+(i+1), images[i]);
            }
        }
        return mDb.insert(DATABASE_TABLE, null, initialValues);
    }

デバッグすると、initialValues のすべての値が設定され、mDb.insert が実行されると終了し、nullPointException と mDb null の値が表示されます。なぜそうなのか理解できません.SO誰かが私を助けることができれば??? また、mDb を次のように初期化しました。

private SQLiteDatabase mDb;

ログキャット:

01-01 11:11:27.963: E/AndroidRuntime(992): FATAL EXCEPTION: main
01-01 11:11:27.963: E/AndroidRuntime(992): java.lang.NullPointerException
01-01 11:11:27.963: E/AndroidRuntime(992):  at com.example.android.photobyintent.DbReceipient.insert(DbReceipient.java:43)
01-01 11:11:27.963: E/AndroidRuntime(992):  at com.example.android.photobyintent.AddRecipient.insertIntoDb(AddRecipient.java:451)
01-01 11:11:27.963: E/AndroidRuntime(992):  at com.example.android.photobyintent.AddRecipient$4.onClick(AddRecipient.java:409)
01-01 11:11:27.963: E/AndroidRuntime(992):  at android.view.View.performClick(View.java:4202)
01-01 11:11:27.963: E/AndroidRuntime(992):  at android.view.View$PerformClick.run(View.java:17340)
01-01 11:11:27.963: E/AndroidRuntime(992):  at android.os.Handler.handleCallback(Handler.java:725)
01-01 11:11:27.963: E/AndroidRuntime(992):  at android.os.Handler.dispatchMessage(Handler.java:92)
01-01 11:11:27.963: E/AndroidRuntime(992):  at android.os.Looper.loop(Looper.java:137)
01-01 11:11:27.963: E/AndroidRuntime(992):  at android.app.ActivityThread.main(ActivityThread.java:5039)
01-01 11:11:27.963: E/AndroidRuntime(992):  at java.lang.reflect.Method.invokeNative(Native Method)
01-01 11:11:27.963: E/AndroidRuntime(992):  at java.lang.reflect.Method.invoke(Method.java:511)
01-01 11:11:27.963: E/AndroidRuntime(992):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
01-01 11:11:27.963: E/AndroidRuntime(992):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
01-01 11:11:27.963: E/AndroidRuntime(992):  at dalvik.system.NativeStart.main(Native Method)
4

5 に答える 5

0

これを mDB で行います。

private SQLiteDatabase mDb = this.getWritableDatabase();
于 2013-01-01T10:57:31.267 に答える
0

mDb次のようにデータベースに挿入する前に初期化します。

public long insert(Recipient recipient, String[] images){
         mDb = Your_sqLiteHelper.getWritableDatabase();

         // your code here

        return mDb.insert(DATABASE_TABLE, null, initialValues);
    }
于 2013-01-01T10:59:03.343 に答える
0

アクセスする前に、mDbが初期化されていないか、nullだと思います。試す:

関数の前 mDb = this.getWritableDatabase();

public long insert(Recipient recipient, String[] images){
    ContentValues initialValues = new ContentValues();
    initialValues.put(FLD_RECIPIENT_ID, Recipient.getFldRecipientId());
    initialValues.put(FLD_INFO, Recipient.getFldInfo());
    initialValues.put(FLD_LATITUDE, Recipient.getFldLatitude());
    initialValues.put(FLD_LONGITUDE, Recipient.getFldLongitude());
    for(int i=0;i<images.length;i++){
        if(images[i]!=null){
            initialValues.put("FLD_IMAGE_URL"+(i+1), images[i]);
        }
    }
     if(mdb!=null){
         return mDb.insert(DATABASE_TABLE, null, initialValues);
     }else {
         return null;
     }
}

戻り値が null の場合は、それに応じて機能します。

于 2013-01-01T11:00:22.437 に答える
0

データベース オブジェクトをアトミックに使用することをお勧めします。必要なときに開き、必要がなくなったらすぐに閉じます。

このようにしてみてください:

SQLiteDatabase db = opener.getWritableDatabase();

    try {
        ContentValues values = new ContentValues();
        /* set values */

        return db.insertOrThrow(tableName, null, values);
    } finally {
        db.close();
    }
于 2013-01-01T11:00:53.140 に答える
0

メソッドを呼び出した時点で、メンバー変数が初期化されていないようmDbです (つまり、まだ初期化されています) 。nullinsert

あなたのクラスのどこにこの変数が割り当てられていますか? おそらく、connect以前に呼び出すのを忘れていたのような名前の別のメソッドを作成しましたinsertか?

私がこれ以上手助けする前に、あなたのクラスのコードをもっと見せる必要があります。

于 2013-01-01T11:01:25.483 に答える