莫道桑榆晚,为霞尚满天。这篇文章主要讲述在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"));
}
推荐阅读
- 将用户输入编辑文本与SQLite数据库Android Java进行比较
- 锁定AppendAllText与TextWriter
- Xamarin Android Nunit测试在测试资源管理器中可被发现,但在运行测试时未被发现。 (VS2017)
- 有人可以建议我为https://jpetstore.cfapps.io/catalog/categories/FISH创建动态xpath
- android中的自定义,禁用和空白地图
- 添加Google地图活动后,Android内置错误
- 无法找到类com.google.android.gms.maps.SupportMapFragment
- Android google Places API超出了每日配额
- 在我的屏幕上显示给我的区域中的android上的地图中显示标记