0

私は本当にこのコードに多くの時間を費やしてきましたが、データベースが機能していない理由はわかりません

1行だけ挿入したいので、この機能を作成しました:

void insertfav(文字列 k) {

    myDataBase = khol();
    Cursor cur = myDataBase.rawQuery("SELECT " + colname + " from "
            + deptTable + " WHERE " + col3 + "=" + "'" + k + "'",
            new String[] {});
    cur.moveToFirst();
    String area = cur.getString(cur.getColumnIndexOrThrow(colname));
    cur = myDataBase.rawQuery("SELECT " + col2 + " from " + deptTable
            + " WHERE " + col3 + "=" + "'" + k + "'", new String[] {});
    cur.moveToFirst();
    String disease = cur.getString(cur.getColumnIndexOrThrow(col2));
    myDataBase.rawQuery(
            "INSERT INTO " + favtable + " ("+colname+", "+col2+", "+col3+")"
                    + "Values (" + "'" + area + "'" + ", " + "'" + disease
                    + "'" + ", " + "'" + k + "'" + ")", new String[] {});
    myDataBase.close();
}

このクエリは、sqlite ブラウザーで実行すると正常に動作しますが、エミュレーターでアプリを実行しているときにこの関数が実際に呼び出されると、何も挿入されません。

khol() はデータベースを開く関数です。khol() 関数のコードは次のとおりです。

public SQLiteDatabase khol() throws SQLException {

    // Open the database
    String myPath = DB_PATH + DB_NAME;
    myDataBase = SQLiteDatabase.openDatabase(myPath, null,
            SQLiteDatabase.OPEN_READWRITE);
    return myDataBase;
}

ここで、DB_PATH と DB_NAME は次のとおりです。

private static String DB_PATH = "/data/data/example.SQLitetest/";

private static String DB_NAME = "desicures.db";

khol() は他のクエリでは正常に動作していますが、ここで何か間違ったことをしている可能性があります...

助けてください...

4

4 に答える 4

1

ドキュメントが言うよう にrawQuery

Runs the provided SQL and returns a Cursor over the result set.

およびexecSQL(String sql):

Execute a single SQL statement that is NOT a SELECT or any other SQL statement 
that returns data.

    Execute a single SQL statement that is not a query. For example, CREATE TABLE, 
DELETE,INSERT, etc. Multiple statements separated by ;s are not supported. it takes a 
write lock

rawQuery.like の代わりに execSQL を使用してみてください

myDataBase.execSQL(
            "INSERT INTO " + favtable + " ("+colname+", "+col2+", "+col3+")"
                    + "Values (" + "'" + area + "'" + ", " + "'" + disease
                    + "'" + ", " + "'" + k + "'" + ");");
于 2012-04-04T18:20:57.837 に答える
1

rawQuery の代わりにmyDatabase.insert()を使用してみてください。

于 2012-04-04T18:12:43.847 に答える
0

メソッドrawQuery()はカーソルを返すため、このメソッドを使用して挿入を行うことはできません。

myDataBase.rawQuery(
        "INSERT INTO " + favtable + " ("+colname+", "+col2+", "+col3+")"
                + "Values (" + "'" + area + "'" + ", " + "'" + disease
                + "'" + ", " + "'" + k + "'" + ")", new String[] {});

間違った方法です。

insert()メソッドを使用でき、フォローインを試すことができます

ContentValues values = new ContentValues();
values.put(colname , area);
values.put(col2 , disease);
values.put(col3 , k);
long rowID = db.insert(favtable, null, values);
System.out.println("Added Row No: "+rowID);
于 2012-04-04T18:17:53.463 に答える
0

コードに関する 3 つのこと

  • rawQuery の代わりに execSQL
  • use?および params でString[]- これはより安全で処理できますk = "ha'ck"
  • カーソルを閉じてください

のように:

myDataBase = khol();
Cursor cur = myDataBase.rawQuery("SELECT " + colname + " from "
        + deptTable + " WHERE " + col3 + "=?",
        new String[] { k });
cur.moveToFirst();
String area = cur.getString(cur.getColumnIndexOrThrow(colname));
cur.close();
cur = myDataBase.rawQuery("SELECT " + col2 + " from " + deptTable
        + " WHERE " + col3 + "=?", new String[] { k });
cur.moveToFirst();
String disease = cur.getString(cur.getColumnIndexOrThrow(col2));
cur.close();

// either
myDataBase.execSQL(
        "INSERT INTO " + favtable + " ("+colname+", "+col2+", "+col3+")"
                + "Values (?, ?, ?)",
                new String[] { area, disease, k });
// or 
ContentValues cv = new ContentValues();
cv.put(colname, area);
cv.put(col2, disease);
cv.put(col3, k);
long newRowId = myDataBase.insert(favtable, colname, cv);

myDataBase.close();

さらに、カーソルが値であるかどうかを確認する必要がある場合がありnullます。列がないためcur.getString、またはエラーが発生する可能性があります(データベースにデータがない場合)。NullPointerException

また、クエリに複数のクエリは必要ありません。一度に複数の列をリクエストできます。

cur = myDataBase.rawQuery("SELECT " + colname + "," + col2 + " from "
        + deptTable + " WHERE " + col3 + "=?", new String[] { k, k });
if (cur.moveToFirst()) {
    // starting at 0 columns are ordered in the way you select them
    String area = cur.getString(0);
    String disease = cur.getString(1);
}
于 2012-04-04T18:26:49.813 に答える