0

ハイスコ​​アテーブル用のSQLiteデータベースを実装しようとしています。データベースの作成と挿入が以下のコードで機能するかどうかを確認するためにテストしています。しかし、以下の行でNullPointerExceptionが発生しています。

前もって感謝します!

Results.java

public class Results extends Activity {
    DatabaseHelper dh;

    public void onCreate(Bundle savedInstanceState) {
        dh = DatabaseHelper.getInstance(this);

    public void showResults() {
        dh.openDB();  
        dh.insert(1231423, 436346);  //Line 104
    }
}

DatabaseHelper.java

private static final String SCORE = "score"; 
private static final String PERCENTAGE = "percentage";
public static DatabaseHelper mSingleton = null;

public synchronized static DatabaseHelper getInstance(Context context) {
    if(mSingleton == null) {
        mSingleton = new DatabaseHelper(context.getApplicationContext());
    }
    return mSingleton;
}

public SQLiteDatabase openDB() {
    return this.getWritableDatabase();
}

public long insert(long score, int percentage) {
    ContentValues values = new ContentValues();
    values.put(SCORE, score);  
    values.put(PERCENTAGE, percentage); 

    return db.insert(TABLE, null, values);  //Line 91
}

LogCat出力

01-02 17:56:47.609: E/AndroidRuntime(1322): FATAL EXCEPTION: main
01-02 17:56:47.609: E/AndroidRuntime(1322): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.test/com.example.test.Results}: java.lang.NullPointerException
01-02 17:56:47.609: E/AndroidRuntime(1322):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2059)
01-02 17:56:47.609: E/AndroidRuntime(1322):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
01-02 17:56:47.609: E/AndroidRuntime(1322):     at android.app.ActivityThread.access$600(ActivityThread.java:130)
01-02 17:56:47.609: E/AndroidRuntime(1322):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
01-02 17:56:47.609: E/AndroidRuntime(1322):     at android.os.Handler.dispatchMessage(Handler.java:99)
01-02 17:56:47.609: E/AndroidRuntime(1322):     at android.os.Looper.loop(Looper.java:137)
01-02 17:56:47.609: E/AndroidRuntime(1322):     at android.app.ActivityThread.main(ActivityThread.java:4745)
01-02 17:56:47.609: E/AndroidRuntime(1322):     at java.lang.reflect.Method.invokeNative(Native Method)
01-02 17:56:47.609: E/AndroidRuntime(1322):     at java.lang.reflect.Method.invoke(Method.java:511)
01-02 17:56:47.609: E/AndroidRuntime(1322):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
01-02 17:56:47.609: E/AndroidRuntime(1322):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
01-02 17:56:47.609: E/AndroidRuntime(1322):     at dalvik.system.NativeStart.main(Native Method)
01-02 17:56:47.609: E/AndroidRuntime(1322): Caused by: java.lang.NullPointerException
01-02 17:56:47.609: E/AndroidRuntime(1322):     at com.example.test.DatabaseHelper.insert(DatabaseHelper.java:91)
01-02 17:56:47.609: E/AndroidRuntime(1322):     at com.example.test.Results.showResults(Results.java:104)
01-02 17:56:47.609: E/AndroidRuntime(1322):     at com.example.test.Results.onCreate(Results.java:50)
01-02 17:56:47.609: E/AndroidRuntime(1322):     at android.app.Activity.performCreate(Activity.java:5008)
01-02 17:56:47.609: E/AndroidRuntime(1322):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
01-02 17:56:47.609: E/AndroidRuntime(1322):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
01-02 17:56:47.609: E/AndroidRuntime(1322):     ... 11 more

編集: NullPointerExceptionは少なくとも飛び回っていますが、エラーはまだあります。コードを編集して、新しいLogCat出力を投稿しました。

4

4 に答える 4

1

openDB()開いた SqliteDatabase を保存し、書き込み可能なデータベースを開くように変更します。

public void openDB() {
    db = this.getWritableDatabase();
}

ただし、これはまだスタック トレースと一致しませんが、提供したコードと一致します。

于 2013-01-02T23:08:08.853 に答える
1

あなたはあなたがやっていると言った:

DatabaseHelper dh;

dh.insert(1231423, 436346);

dh をインスタンス化していないようです:

dh = new DatabaseHelper(this);

DatabaseHelper インスタンスが 1 つだけ必要になるため、シングルトン パターンを使用することをお勧めします。

private static final String TABLE_NAME = "table_name";
private static final int SCHEME_VERSION = 1;
public static DatabaseHelper mSingleton = null;

private DatabaseHelper(Context ctxt) {
    super(ctxt, DATABASE_NAME, null, SCHEME_VERSION);
}

public synchronized static DatabaseHelper getInstance(Context ctxt) {
    if (mSingleton == null)
        mSingleton = new DatabaseHelper(ctxt.getApplicationContext());
    return mSingleton;
}

これで、次のように呼び出すことができます。

DatabaseHelper dh = DatabaseHelper.getInstance(this);
于 2013-01-02T23:08:11.913 に答える
0

一般的な SqlliteHelper パターンに従っている場合は、insert を呼び出す前に .open() メソッドを呼び出すのを忘れている可能性があります。

于 2013-01-02T22:36:23.683 に答える