0

我真的在这段代码上花了很多时间,但我无法解释数据库无法正常工作的任何原因

我只想插入一行。所以我创建了这个函数:

无效插入fav(字符串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

您可能想尝试使用myDatabase.insert()而不是 rawQuery。

于 2012-04-04T18:12:43.847 回答
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

尝试使用 execSQL 而不是 rawQuery.like

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

rawQuery() 方法返回游标,你不能使用这个方法进行插入,所以

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

是错误的方法。

你可以使用 insert() 方法,你可以尝试followin

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

关于代码的三件事

  • execSQL 而不是 rawQuery
  • 在 - 中使用?和参数,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 回答