我正在创建一个应用来记录不同类的作业。每个班级都有自己的唯一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)");
}
答案 0 :(得分:2)
请尝试以下此查询来创建新列名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"));
}
答案 1 :(得分: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 });
}
答案 2 :(得分:0)
res.getColumnIndex(" id")将为您提供名称为" id"的列的列索引。并且因为你得到-1,它无法找到它..你确定你的id列不是" _id"?
要实现这一点,你应该做这样的事情......
res.getLong(res.getColumnIndex("_id"));
(我建议你使用getLong()而不是getInt(),因为SQLite数据库ID可能比int更大。
答案 3 :(得分: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,检查您的Log是否已成功创建表,如果它不为null,请确保您的表中包含列id
。
答案 4 :(得分: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;
}