SQLite 获取 ID 和名称,其中名称喜欢


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";请注意,游标中的列名是idGROUP_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(( 来获取该位置。

最新更新