我有一张这样的桌子:

      database.execSQL("CREATE  TABLE IF NOT EXISTS food_table (food_id INTEGER PRIMARY KEY  AUTOINCREMENT  NOT NULL , food_name CHAR, food_raw CHAR)");


我有一个像这样的String数组:

    public static ArrayList<String> rawsNames = new ArrayList<String>();


现在我想在表中搜索,如果所有未加工的食物都在rawsNames中,则返回food_name。

我这样做:

String raws = AdapterNotes.rawsNames.toString().replace("]", "").replace("[", "");
Cursor cursor = G.database.rawQuery("select * from food_table WHERE food_raw LIKE '%" + raws + "%' ", null);
    while (cursor.moveToNext()) {
        String name = cursor.getString(cursor.getColumnIndex("food_name"));


但是,如果改变了食物的原料,那就行不通了。

请帮我。

最佳答案

看来food_table包含以下字段:

food_id:分配给食品的唯一ID
food_name:食品名称
food_raw:用,分隔的成分

现在,由于成分可能相同,但顺序与数据库中存储的顺序不同,因此简单的WHERE LIKE %"a, b, c"%不会起作用,因为b, a, c也是相同食物的有效成分(只是顺序是不同的)。

因此,您需要匹配每个单独的成分,而不是整体上的所有成分:

String req = "";
for(String rawName : rawNames)
  req += " food_raw LIKE %"+rawName+"% AND";
if(req.length() > 4)
  req = req.substring(0, req.length()-4); // to remove last " AND"
String query = "SELECT * FROM food_table WHERE "+req;


使用query,无论项目顺序如何,您都应该能够获得食物名称。

08-06 12:45