3

私のプロジェクトでは、クラス内のデータベースに要素を挿入する関数を追加しpublic class DBHelper extends SQLiteOpenHelperます。関数を以下に示します。

public void insertIntoDatabase(String field_one,String field_two){
    String sql = "INSERT INTO UserTable.NAME (COL_USERNAME, COL_PASSWORD) " +
            "VALUES (" + field_one + ", " + field_two + ")";
    db.execSQL(sql);

メイン アクティビティでは、名前とパスワードを読み取り、関数を呼び出してデータベースに挿入します

DBHelper dbhelper;



dbhelper.insertIntoDatabase(rdname.getText().toString(), rdpwrd.getText().toString());

しかし、エラーがありました。

4

3 に答える 3

6

db.insert()テーブルに新しい行を挿入するために直接指定されたSQLiteDatabaseのAPIメソッドを使用することをお勧めします。このソリューションはよりクリーンです。

public void insertIntoDatabase(String field_one, String field_two){
   ContentValues data = new ContentValues();
   data.put("COL_USERNAME", field_one);
   data.put("COL_PASSWORD", field_two);
   if (db == null) {
      // make sure that your db is properly initialised
   }
   db.insert("tablename", "nullColumnHack", data);
}

nullColumnHackの説明:

指定した値が空の場合、列名は不明であり、空の行を挿入することはできません。nullに設定されていない場合、nullColumnHackパラメーターは、値が空の場合にNULLを明示的に挿入するためのnull許容列名の名前を提供します。

これは、空のContentValuesを渡した場合Android SQLiteに割り当てられる1つの列を指定する必要があることを意味します。NULL

あなたがあなたのアプローチを使いたいのなら、私はあなたにプレースホルダーの使用をお勧めします。

String sql = "INSERT INTO UserTable.NAME (COL_USERNAME, COL_PASSWORD) " +
            "VALUES (?, ?)";
    db.execSQL(sql, new String[] {field_one, field_two});

注:一重引用符を使用しなかったため、おそらく機能しませんでした。

VALUES ("' + field_one + '", "' + field_two + '")"

また、指定されたテーブル名が正しいことを確認してください。テーブル名と列名を保持する静的変数を作成することをお勧めします。

public static final String TABLE_NAME = "Table";
String query = "insert into " + ClassName.TABLE_NAME + " values(?, ?)"
于 2013-03-15T13:16:20.323 に答える
0

SQL 文字列は、静的変数を SQL ステートメントの残りの部分から分離しません。これで修正されるはずです:

String sql = "INSERT INTO " + UserTable.NAME + "(" + COL_USERNAME + "," + COL_PASSWORD ") VALUES (" + ...

UserTable.NAME がテーブル名であり、COL_USERNAME および COL_PASSWORD の値とまったく同じ名前のフィールドがあることを確認してください。

于 2013-03-15T13:25:25.690 に答える