0

私は Android プログラミングが初めてで、Java で錆びています! 私は、ユーザーにEditTextに何かを入力するように求める小さなプログラムに取り組んでおり、時間が停止するか、ユーザーが[完了]ボタンをクリックすると、ユーザーが設定した値をデータベースで検索します。とは言っても、その部分でエラーが発生しています。:(

public class UserScreen extends Activity implements View.OnClickListener {

    public TextView tvCounter;
    public EditText input;
    public Button finish;

    public void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.gamescreen);

        tvCounter = (TextView) findViewById(R.id.tvCounter);
        finish = (Button) findViewById(R.id.bFinish);
        finish.setOnClickListener(this);

        new CountDownTimer(30000, 1000) {

            public void onTick(long millisUntilFinished) {
                tvCounter.setText("seconds remaining: "
                        + Long.toString(millisUntilFinished / 1000));
            }

            public void onFinish() {
                tvCounter.setText("done!");
                searchDB();
            }
        }.start();
    }

    private SQLiteDatabase database;
    private DatabaseHelper dbHelper;

    public void searchDB() {
        Object tableList[] = { "table1", "table2", "table3", "table4",
                "table5", "table6" };
        Object columnList[] = { "column1", "column2", "column3", "column4", "column5", "column6" };
        int pList[] = { R.id.et1, R.id.et2, R.id.et3,
                R.id.et4, R.id.et5, R.id.et6 };

        database = dbHelper.getReadableDatabase();
        Cursor cursor = null;

        for (int i = 0; i < tableList.length; i++) {

            input = (EditText) findViewById(pList[i]);
            String data = input.getText().toString();

            cursor = database.rawQuery("SELECT * FROM " + tableList[i]
                    + " WHERE " + pList[i] + " = " + columnList[i], null);

            String dbStuff = cursor.toString();
                        if (dbStuff == data) { 
                            tvCounter.setText("YEAH");
                        } 
                        else { 
                        tvCounter.setText("DAMN"); 
                        }
        }
        cursor.close();
    }

    public void onClick(View v) {
        // TODO Auto-generated method stub
        searchDB();
    }
}

エラーは次のとおりです。

07-28 17:43:59.385: E/AndroidRuntime(920): FATAL EXCEPTION: main
07-28 17:43:59.385: E/AndroidRuntime(920): java.lang.NullPointerException
07-28 17:43:59.385: E/AndroidRuntime(920): at com.example.androidgame.GameScreen.searchDB(GameScreen.java:56)
07-28 17:43:59.385: E/AndroidRuntime(920): at com.example.androidgame.GameScreen.onClick(GameScreen.java:84)
07-28 17:43:59.385: E/AndroidRuntime(920): at android.view.View.performClick(View.java:3511)
07-28 17:43:59.385: E/AndroidRuntime(920): at android.view.View$PerformClick.run(View.java:14105)
07-28 17:43:59.385: E/AndroidRuntime(920): at android.os.Handler.handleCallback(Handler.java:605)
07-28 17:43:59.385: E/AndroidRuntime(920): at android.os.Handler.dispatchMessage(Handler.java:92)
07-28 17:43:59.385: E/AndroidRuntime(920): at android.os.Looper.loop(Looper.java:137)
07-28 17:43:59.385: E/AndroidRuntime(920): at android.app.ActivityThread.main(ActivityThread.java:4424)
07-28 17:43:59.385: E/AndroidRuntime(920): at java.lang.reflect.Method.invokeNative(Native Method)
07-28 17:43:59.385: E/AndroidRuntime(920): at java.lang.reflect.Method.invoke(Method.java:511)
07-28 17:43:59.385: E/AndroidRuntime(920): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784)
07-28 17:43:59.385: E/AndroidRuntime(920): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551)
07-28 17:43:59.385: E/AndroidRuntime(920): at dalvik.system.NativeStart.main(Native Method)

DBへの作成やアクセスは別のクラスです。

public class DBAccess extends Activity {

private DatabaseHelper databaseHelper;
private SQLiteDatabase db;


public void onCreate(Context context){
    databaseHelper = new DatabaseHelper(context);
    searchDB();
}

public void openDB(){
    db = databaseHelper.getWritableDatabase();
}
public void closeDB(){
    db.close();
}
public void searchDB(){
    Intent Scoring = getIntent();
    String rawdata[] = Scoring.getStringArrayExtra("data");
    openDB();
    Object tableList[] = { "table1", "table2", "table3", "table4", "table5", "table6" };
    Object columnList[] = { "KEY_COLUMN1", "KEY_COLUMN2", "KEY_COLUMN3", "KEY_COLUMN4", "KEY_COLUMN5",
    "KEY_COLUMN6" };

    int downScore = 0;
    int upScore = 0;
    String dbStuff;

    Cursor cursor = null;

    for (int i = 0; i < tableList.length; i++) {
        if(rawdata[i] == "niente")
            downScore = downScore + 5;
        else {
            cursor = db.rawQuery("SELECT * FROM " + tableList[i] + " WHERE " + rawdata[i] + " = " + columnList[i] , null);
        dbStuff = cursor.toString();
        if (i == 0)
             cursor.moveToFirst();
        else
            cursor.moveToNext();
        if(dbStuff == rawdata[i])
            upScore = upScore + 10;
        else
            downScore = downScore + 5;
        }
    }
    closeDB();
    cursor.close();
    Intent i = new Intent(this, ScoreScreen.class);
    i.putExtra("uScore", upScore);
    i.putExtra("dScore", downScore);
    }

}

4

2 に答える 2

1

設計上、DB の構築と保守の側面を DB アクセス層自体から分離します。

このために、2つのクラスがあります。1) DBHelper.java にすべての構築と保守を入れ、2) DBAccess.java には DB にアクセスするためのメソッドがあります。

以下は、このためのコード スニペットです... アプリケーション (アクティビティ) 自体は何も認識せず、DB 自体の構築について可視性を持たないことに注意してください (DBHelper クラス自体の可視性を参照)。オープン、クローズ、CRUD メソッドなどのメソッド...


:

class DBHelper extends SQLiteOpenHelper {

    :
    :

    private SQLiteDatabase db;
    private static final int DATABASE_VERSION = 1;
    private static final String DB_NAME = "dbname.db";
    :
    :

}

public class DBAccess {

    :
    :

    private DBHelper dbHelper;
    private SQLiteDatabase db;

    :
    :

    public DBAccess(Context context) {
        dbHelper = new DBHelper(context);
    }

    /**
     * Open the database
     */
    public void openDB() {
        db = dbHelper.getWritableDatabase();
    }

    /**
     * Close the database
     */
    public void closeDB() {
        db.close();
    }

    :
    :
}

DB を使用するアクティビティでは、setupDB() というメソッドを使用できます。このメソッドは、アクティビティの作成中に呼び出されます。

private void setupDB() {
    dbAccess = new DBAccess(this);
    dbAccess.openDB();
}

:

private void searchDB() {
    :

    mStatusList = dbAccess.selectAllStatus();

    :
}

:
:
于 2012-07-28T21:26:04.620 に答える
0

データベースを初期化する必要があり、次のヘルパーですonCreate()

  database = new SQLiteDatabase();
  dbHelper = new DatabaseHelper();
于 2012-07-28T18:04:52.267 に答える