id| name |...
--------------
1 |Emmi blaa|..
2 |Emmi haa |..
3 |Emmi naa |..
我有一个SQLite数据库,其中的表名为contacts,其中包含id,name和其他信息。我正在尝试使用在EditText中提供的名称变量来获取名称和ID。
String query = "SELECT name, id FROM contacts WHERE name LIKE \"%" + name + "%\"";
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursorC = db.rawQuery(query, null);
while (cursorC.moveToNext()) {
System.out.println(cursorC.getString(0));
}
使用上面的代码,我只能获取名称,而不能获取ID,因此我尝试了GROUP_CONCAT
String query = "SELECT id, GROUP_CONCAT(name) FROM contacts WHERE name LIKE \"%" + name + "%\" GROUP BY id";
现在我仅获得ID。例如,如何获取名称变量为“ mm”的ID和名称?
答案 0 :(得分:1)
您的第一个查询一切正常。您仅获得名称,因为您仅获得结果的第一列:System.out.println(cursorC.getString(0));
要获取其他列,请使用类似的方法cursor.getString()
或cursor.getInteger()
,并以1
作为参数。甚至cursor.getInt(cursor.getColumnIndex("id"))
来自the docs:
对于每一行,您可以通过调用Cursor get方法之一(例如getString()或getLong())来读取列的值。对于每个get方法,必须传递所需列的索引位置,可通过调用getColumnIndex()或getColumnIndexOrThrow()获得该索引位置。
答案 1 :(得分:1)
我相信您的问题不是第一个查询没有获取ID,而是您没有从游标中检索ID列。
以下将起作用:-
String query = "SELECT name, id FROM contacts WHERE name LIKE \"%" + name + "%\"";
SQLiteDatabase db = this.getWritableDatabase();
Cursor cursorC = db.rawQuery(query, null);
while (cursorC.moveToNext()) {
System.out.println(cursorC.getString(0) + " : " + cursorC.getString(1));
}
但是,理想情况下,您应该使用Cursor getLong 方法来检索id,因为 id 可以和64位有符号整数一样大。因此System.out.println(cursorC.getString(0) + " : " + String.valueOf(cursorC.getLong(1)));
会更好。
另外一个改进是使用游标的 getColumnIndex(the_column_name)方法。这是更灵活的,因为根据列名确定列的索引。因此,建议使用System.out.println(cursorC.getString(cursorC.getColumnIndex("name")) + " : " + String.valueOf(cursorC.getLong(cursorC.getColumnIndex("id"))));
(建议将表和列名定义为常量,然后使用这些常量,而不是对列/表名进行硬编码)。
例如如果查询更改为SELECT id, name FROM contacts WHERE name LIKE \"%" + name + "%\""
,则使用硬编码的偏移量0和1将转置结果。但是,如果使用getColumnIndex,结果将保持不变。
如果您想使用第二个查询String query = "SELECT id, GROUP_CONCAT(name) FROM contacts WHERE name LIKE \"%" + name + "%\" GROUP BY id";
,请注意,游标中的列名称为 id 和 GROUP_CONCAT(name),通常,将使用 AS 关键字为该名称赋予别名。例如String query = "SELECT id, GROUP_CONCAT(name) AS all_names FROM contacts WHERE name LIKE \"%" + name + "%\" GROUP BY id";
然后,结果光标中的列名称将为 all_names 。