在Android中使用SQLite获取RowID

问题描述 投票:1回答:5

我正在创建一个应用程序来记录不同类的作业。每个类都有自己唯一的ID,因此为每个类列出的赋值不会与其他类重叠。这是我为某个类找到rowid的方法。

public int getIdFromClassName(String className){
    String query = "SELECT rowid FROM " + CLASSES_TABLE_NAME + " WHERE " + CLASSES_COLUMN_NAME + " = '" + className + "'";
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor res = db.rawQuery(query, null);
    return res.getColumnIndex("id");
}

但是,它始终返回值-1。

有什么想改变以返回正确的rowid值?

编辑:

@Override
public void onCreate(SQLiteDatabase db) {
    // TODO Auto-generated method stub
    db.execSQL(
            "create table " + CLASSES_TABLE_NAME + " " +
                    "(id integer primary key, " + CLASSES_COLUMN_NAME + " text)"
    );
    db.execSQL(
            "create table " + ASSIGNMENTS_TABLE_NAME + " " +
                    "(id integer primary key, " + ASSIGNMENTS_COLUMN_NAME + " text, " + ASSIGNMENTS_COLUMN_TOTAL_POINTS
                    + " INTEGER, " + ASSIGNMENTS_COLUMN_CLASS_ID + " INTEGER)");

}
java android sqlite
5个回答
1
投票

查询返回的列名为rowid,因此您将找不到名为id的列。

确保在查询和getColumnIndex调用中使用相同的列名。

并且该列的索引始终为零;您还需要从列中读取实际值:

int colIndex = res.getColumnIndexOrThrow("rowid"); // = 0
if (res.moveToFirst()) {
    return res.getInt(colIndex);
} else {
    // not found
}

但是,Android有一个helper function,可以更容易地读取单个值:

public int getIdFromClassName(String className){
    String query = "SELECT rowid" +
                   " FROM " + CLASSES_TABLE_NAME +
                   " WHERE " + CLASSES_COLUMN_NAME + " = ?;";
    SQLiteDatabase db = this.getReadableDatabase();
    return DatabaseUtils.longForQuery(db, query, new String[]{ className });
}

0
投票

res.getColumnIndex(“id”)将获取名称为“id”的列的列索引。并且因为你得到-1,它无法找到它..你确定你的id列不是“_id”吗?

为了让这个工作你应该做这样的事情..

res.getLong(res.getColumnIndex("_id"));

Cursor.getColumnIndex()

Cursor.getLong()

(我建议你使用getLong()而不是getInt(),因为SQLite数据库ID可以比int更大。)


0
投票

你可以试试这个:

public int getIdFromClassName(String className){
String query = "SELECT id FROM " + CLASSES_TABLE_NAME + " WHERE " + CLASSES_COLUMN_NAME + " = '" + className + "'";
SQLiteDatabase db = this.getReadableDatabase();
Cursor res = db.rawQuery(query, null);
int id=-1;
If(res!=null&&res.moveToFirst())
id=res.getInt(res.getColumnIndex("id"));
return id;
}

0
投票
public int getIdFromClassName(String className) {
        String query = "SELECT rowid FROM " + CLASSES_TABLE_NAME + " WHERE "
                + CLASSES_COLUMN_NAME + " = '" + className + "'";
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor res = db.rawQuery(query, null);
        if (res != null) {
            if (res.moveToFirst()) {
                do {
                    return Integer.parseInt(res.getString(res.getColumnIndex("id"))); // if your column name is rowid then replace id with rowid
                } while (res.moveToNext());
            }
        } else {
            Toast.makeText(context, "cursor is null", Toast.LENGTH_LONG).show();
        }
    }

检查你的Cursor如果它的null检查你的日志你的表是否成功创建,如果它不为null,请确保你的表中有列id


0
投票

请尝试以下查询来创建新的列名rowID

Cursor cursor= db.rawQuery("SELECT *,"+CLASSES_TABLE_NAME +".rowid AS rowID"+" FROM "+CLASSES_TABLE_NAME , null);

在此查询之后,您可以从rowid列中获取真正的rowID

while (cursor.moveToNext()) {
        long chatRow=cursor.getLong(
                cursor.getColumnIndexOrThrow("rowID"));
}
© www.soinside.com 2019 - 2024. All rights reserved.