0

アプリの 3 つの EditText ボックスからテキスト入力を取得し、それらをデータベースに保存しようとしています。チュートリアルに従ってデータベースを作成しましたが、それが機能するかどうかを確認する方法がわかりません。送信ボタンを押してデータベースに投稿すると、アンドロイドによるとアプリが突然停止することを知っています。

public void insertData(int name, int location, int kill){
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues cv = new ContentValues();
    db.open();
    cv.put(colDeptID, 1);
    cv.put(colDeptName, "Sales");
    db.insert(deptTable, colDeptID, cv);
    cv.put(colDeptID, 2);
    cv.put(colDeptName, "IT");
    db.insert(deptTable, colDeptID, cv);
    db.close();                   

}

これは、データベース内の新しい変数に名前、場所、およびキルを割り当てるとともに、ボタンのサブルーチンで呼び出すサブルーチンです。ボタンを押すサブルーチンは次のとおりです。

public void postResults(View button){
    findViewById(R.id.hunters_name);
    findViewById(R.id.location);
    findViewById(R.id.results);
    int kill = R.id.results;
    int location = R.id.location;
    int name = R.id.hunters_name;
    DatabaseHelper dbHelp = new DatabaseHelper(null);
    dbHelp.insertData(name, location, kill);

}

アプリが強制終了される理由がわかりません。

ログキャット:

FATAL EXCEPTION: main
01-10 21:15:50.568: E/AndroidRuntime(973): java.lang.IllegalStateException: Could not execute method of the activity
01-10 21:15:50.568: E/AndroidRuntime(973):  at android.view.View$1.onClick(View.java:3597)
01-10 21:15:50.568: E/AndroidRuntime(973):  at android.view.View.performClick(View.java:4202)
01-10 21:15:50.568: E/AndroidRuntime(973):  at android.view.View$PerformClick.run(View.java:17340)
01-10 21:15:50.568: E/AndroidRuntime(973):  at android.os.Handler.handleCallback(Handler.java:725)
01-10 21:15:50.568: E/AndroidRuntime(973):  at android.os.Handler.dispatchMessage(Handler.java:92)
01-10 21:15:50.568: E/AndroidRuntime(973):  at android.os.Looper.loop(Looper.java:137)
01-10 21:15:50.568: E/AndroidRuntime(973):  at android.app.ActivityThread.main(ActivityThread.java:5039)
01-10 21:15:50.568: E/AndroidRuntime(973):  at java.lang.reflect.Method.invokeNative(Native Method)
01-10 21:15:50.568: E/AndroidRuntime(973):  at java.lang.reflect.Method.invoke(Method.java:511)
01-10 21:15:50.568: E/AndroidRuntime(973):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
01-10 21:15:50.568: E/AndroidRuntime(973):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
01-10 21:15:50.568: E/AndroidRuntime(973):  at dalvik.system.NativeStart.main(Native Method)
01-10 21:15:50.568: E/AndroidRuntime(973): Caused by: java.lang.reflect.InvocationTargetException
01-10 21:15:50.568: E/AndroidRuntime(973):  at java.lang.reflect.Method.invokeNative(Native Method)
01-10 21:15:50.568: E/AndroidRuntime(973):  at java.lang.reflect.Method.invoke(Method.java:511)
01-10 21:15:50.568: E/AndroidRuntime(973):  at android.view.View$1.onClick(View.java:3592)
01-10 21:15:50.568: E/AndroidRuntime(973):  ... 11 more
01-10 21:15:50.568: E/AndroidRuntime(973): Caused by: java.lang.NullPointerException
01-10 21:15:50.568: E/AndroidRuntime(973):  at android.database.sqlite.SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:224)
01-10 21:15:50.568: E/AndroidRuntime(973):  at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:164)
01-10 21:15:50.568: E/AndroidRuntime(973):  at com.example.test.DatabaseHelper.insertData(DatabaseHelper.java:77)
01-10 21:15:50.568: E/AndroidRuntime(973):  at com.example.test.MainActivity.postResults(MainActivity.java:77)
01-10 21:15:50.568: E/AndroidRuntime(973):  ... 14 more

NullPointerException が表示されますが、修正方法がわかりません。

コンストラクター: public DatabaseHelper(Context context) { super(context, dbName, null,33); }

onCreate: @Override public void onCreate(SQLiteDatabase db) { // TODO 自動生成メソッド スタブ

  db.execSQL("CREATE TABLE "+deptTable+" ("+colDeptID+ " INTEGER PRIMARY KEY , "+
    colDeptName+ " TEXT)");

  db.execSQL("CREATE TABLE "+employeeTable+" ("+colID+" INTEGER PRIMARY KEY AUTOINCREMENT, "+
        colName+" TEXT, "+colAge+" Integer, "+colDept+" INTEGER NOT NULL ,FOREIGN KEY ("+colDept+") REFERENCES"+deptTable+" ("+colDeptID+"));");


  db.execSQL("CREATE TRIGGER fk_empdept_deptid " +
    " BEFORE INSERT "+
    " ON "+employeeTable+

    " FOR EACH ROW BEGIN"+
    " SELECT CASE WHEN ((SELECT "+colDeptID+" FROM "+deptTable+"WHERE "+colDeptID+"=new."+colDept+" ) IS NULL)"+
    " THEN RAISE (ABORT,'Foreign Key Violation') END;"+
    "  END;");

  db.execSQL("CREATE VIEW "+viewEmps+
    " AS SELECT "+employeeTable+"."+colID+" AS _id,"+
    " "+employeeTable+"."+colName+","+
    " "+employeeTable+"."+colAge+","+
    " "+deptTable+"."+colDeptName+""+
    " FROM "+employeeTable+" JOIN "+deptTable+
    " ON "+employeeTable+"."+colDept+" ="+deptTable+"."+colDeptID
    );
  //Inserts pre-defined departments
 // InsertDepts(db);  
 }
4

3 に答える 3

0

Logcatの出力を確認してください。そこにNULLPointer例外が表示される可能性があります。

$> adb logcat(ログを表示する方法です)。

于 2013-01-10T21:38:34.890 に答える
0

あなたのメソッドpostResultは何をすべきですか?なぜなら

findViewById(R.id.hunters_name);
findViewById(R.id.location);
findViewById(R.id.results);

何もしない

と:

int kill = R.id.results;
int location = R.id.location;
int name = R.id.hunters_name;

このビューへのポインタのようなものを提供します。

xmlにある場合:

 <EditText android:id="@+id/foobar"

次に、R.idにこのEditTextへのポインタが自動的に作成されます。

R.id.foobar  

数値だけを与える(正しいリソースと同一である-あなたのeditText)

このリソースを取得するには、次を使用する必要があります。

View v = findViewById(R.id.foobar);

EditTextの場合、キャストを使用できます。

EditText et = (EditText) findViewById(R.id.foobar) 

このeditTextに値があり、この値を読みたい場合:

int kill = et.getText();
于 2013-01-10T21:38:44.477 に答える
0

おそらく、DatabaseHelper のパラメーターとしてコンテキストを指定する必要があります。変化する:

DatabaseHelper dbHelp = new DatabaseHelper(null);

為に:

DatabaseHelper dbHelp = new DatabaseHelper(getApplicationContext());

役に立たない場合は、DatabaseHelper クラスから使用するコンストラクター、onCreate メソッド、および create ステートメントを表示します。

于 2013-01-10T22:23:43.793 に答える