id| name |...
--------------
1 |Emmi blaa|..
2 |Emmi haa |..
3 |Emmi naa |..
我有SQLite数据库,其中包含名为联系人的表,其中包含id,姓名和其他信息。我正在尝试使用我在 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 和名称?
我相信您的问题不是第一个查询没有获取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));
}
但是,理想情况下,您应该使用 CursorgetLong方法来检索 id,因为id可以像 64 位有符号整数一样大。所以System.out.println(cursorC.getString(0) + " : " + String.valueOf(cursorC.getLong(1)));
会更好。
此外,一个改进是使用 Cursor 的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。
您的第一个查询一切正常。您只得到名称,因为您只得到结果的第一列:System.out.println(cursorC.getString(0));
若要获取其他列,请使用类似的方法cursor.getString()
或cursor.getInteger()
1
作为参数。甚至cursor.getInt(cursor.getColumnIndex("id"))
从文档中:
对于每一行,您可以通过调用 Cursor get 方法之一来读取列的值,例如 getString(( 或 getLong((。对于每个 get 方法,您必须传递所需列的索引位置,您可以通过调用 getColumnIndex(( 或 getColumnIndexOrThrow(( 来获取该位置。