在Android中使用SQLite获取RowID

莫道桑榆晚,为霞尚满天。这篇文章主要讲述在Android中使用SQLite获取RowID相关的知识,希望能为你提供帮助。
我正在创建一个应用程序来记录不同类的作业。每个类都有自己唯一的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值?
【在Android中使用SQLite获取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)"); }

答案查询返回的列名为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 }); }

另一答案res.getColumnIndex(“id”)将获取名称为“id”的列的列索引。并且因为你得到-1,它无法找到它..你确定你的id列不是“_id”吗?
为了让这个工作你应该做这样的事情..
res.getLong(res.getColumnIndex("_id"));

Cursor.getColumnIndex()
Cursor.getLong()
(我建议你使用getLong()而不是getInt(),因为SQLite数据库ID可以比int更大。)
另一答案你可以试试这个:
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; }

另一答案
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
另一答案请尝试以下查询来创建新的列名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")); }


    推荐阅读