0

必要なスニペットのみを含めるようにコードをトリミングしました。私は雑学クイズゲームを作成しています。ゲームが完了すると、Results.javaは現在のゲームの統計を表示および表示し、完了したゲームをハイスコア(SQLiteデータベース)に送信します。Results.javaクラスが呼び出されると、nullpointer例外が発生します(NPの結果についてコメントしました)。

SQLiteデータベースを作成してプロジェクトの1つに実装しようとするのはこれが初めてです。コード構造や私のデータベースコードに問題があると思われるその他のアドバイスは大歓迎です!

DatabaseHelper.java

public class DatabaseHelper extends SQLiteOpenHelper { 

    //variables

    public DatabaseHelper(Context context) { 
        super(context, DB_NAME, null, DATABASE_VERSION); 
        myDB = getWritableDatabase();
    }

    public void createDatabase() throws IOException {
        boolean dbExist = checkDatabase();
        if(dbExist) {
            //Do nothing - DB already exists.
        } else {
            myDB.execSQL("CREATE TABLE " + TABLE + " ("
                            + RANK + " INTEGER,"
                            + SCORE + " LONG,"
                            + PERCENTAGE + " INTEGER"
                            + ");");
        }
    }

    //Insert new record.
    public long insert(int rank, long score, int percentage) {
        ContentValues values = new ContentValues();
        values.put(RANK, rank);
        values.put(SCORE, score);
        values.put(PERCENTAGE, percentage);

        return myDB.insert(DB_NAME, null, values);  //Line 56
    }

                //other methods...

    public void onCreate(SQLiteDatabase db) {}
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}
}

Results.java

public class Results extends Activity {

    DatabaseHelper dh;

    int rank;
    long score;

    @Override
    public void onCreate(Bundle savedInstanceState) {

                    //...
                    dh = new DatabaseHelper(this);
                    score = getIntent().getLongExtra("score", -1);

                    //...
    }

    public void showResults() {

        //...

        percentage = 10 * cAnswers;

                          //...

        dh.insert(1, score, percentage);  //Line 100
    }

    public void restart() {
        //...
    }
}

編集:NullPointerエラーはなくなりましたが、新しいLogCat出力が表示されています。これは以下にあります。

LogCat出力

12-18 19:47:48.280: E/SQLiteLog(1527): (1) no such table: highscoresDatabase
12-18 19:47:48.370: E/SQLiteDatabase(1527): Error inserting percentageX=30 scoreX=827 rankX=1
12-18 19:47:48.370: E/SQLiteDatabase(1527): android.database.sqlite.SQLiteException: no such table: highscoresDatabase (code 1): , while compiling: INSERT INTO highscoresDatabase(percentageX,scoreX,rankX) VALUES (?,?,?)
12-18 19:47:48.370: E/SQLiteDatabase(1527):     at android.database.sqlite.SQLiteConnection.nativePrepareStatement(Native Method)
12-18 19:47:48.370: E/SQLiteDatabase(1527):     at android.database.sqlite.SQLiteConnection.acquirePreparedStatement(SQLiteConnection.java:882)
12-18 19:47:48.370: E/SQLiteDatabase(1527):     at android.database.sqlite.SQLiteConnection.prepare(SQLiteConnection.java:493)
12-18 19:47:48.370: E/SQLiteDatabase(1527):     at android.database.sqlite.SQLiteSession.prepare(SQLiteSession.java:588)
12-18 19:47:48.370: E/SQLiteDatabase(1527):     at android.database.sqlite.SQLiteProgram.<init>(SQLiteProgram.java:58)
12-18 19:47:48.370: E/SQLiteDatabase(1527):     at android.database.sqlite.SQLiteStatement.<init>(SQLiteStatement.java:31)
12-18 19:47:48.370: E/SQLiteDatabase(1527):     at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1467)
12-18 19:47:48.370: E/SQLiteDatabase(1527):     at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1339)
12-18 19:47:48.370: E/SQLiteDatabase(1527):     at com.example.test.DatabaseHelper.insert(DatabaseHelper.java:56)
12-18 19:47:48.370: E/SQLiteDatabase(1527):     at com.example.test.Results.showResults(Results.java:100)
12-18 19:47:48.370: E/SQLiteDatabase(1527):     at com.example.test.Results.onCreate(Results.java:50)
12-18 19:47:48.370: E/SQLiteDatabase(1527):     at android.app.Activity.performCreate(Activity.java:5008)
12-18 19:47:48.370: E/SQLiteDatabase(1527):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1079)
12-18 19:47:48.370: E/SQLiteDatabase(1527):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2023)
12-18 19:47:48.370: E/SQLiteDatabase(1527):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2084)
12-18 19:47:48.370: E/SQLiteDatabase(1527):     at android.app.ActivityThread.access$600(ActivityThread.java:130)
12-18 19:47:48.370: E/SQLiteDatabase(1527):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1195)
12-18 19:47:48.370: E/SQLiteDatabase(1527):     at android.os.Handler.dispatchMessage(Handler.java:99)
12-18 19:47:48.370: E/SQLiteDatabase(1527):     at android.os.Looper.loop(Looper.java:137)
12-18 19:47:48.370: E/SQLiteDatabase(1527):     at android.app.ActivityThread.main(ActivityThread.java:4745)
12-18 19:47:48.370: E/SQLiteDatabase(1527):     at java.lang.reflect.Method.invokeNative(Native Method)
12-18 19:47:48.370: E/SQLiteDatabase(1527):     at java.lang.reflect.Method.invoke(Method.java:511)
12-18 19:47:48.370: E/SQLiteDatabase(1527):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
12-18 19:47:48.370: E/SQLiteDatabase(1527):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
12-18 19:47:48.370: E/SQLiteDatabase(1527):     at dalvik.system.NativeStart.main(Native Method)
4

2 に答える 2

4

あなたは置くことはできません

DatabaseHelper dh = new DatabaseHelper(this);

フィールド宣言スペースで。thisこれは、少なくともコンテキストonCreateまたは他のアクティビティメソッドまではコンテキストにアクセスできないためです。this内部を参照する行を移動してみてくださいonCreate

于 2012-12-26T18:18:47.623 に答える
4

呼び出された後にのみアクティビティのコンテキストを使用できますonCreate()。それ以外の場合は、まだ有効ではありません。コードを次のように変更するだけです。

DatabaseHelper db;

@Override
public void onCreate(Bundle savedInstanceState) {
    ...
    db = new DatabaseHelper(this);

添加

no such table: highscoresDatabase

間違った文字列を使用しています。56行TABLE目の代わりに使用してください。DB_NAME

return myDB.insert(TABLE, null, values); // Line 56
于 2012-12-26T18:18:53.740 に答える