Java SQLiteException:near";从“开始”:多个联接的语法错误

Java SQLiteException:near";从“开始”:多个联接的语法错误,java,android,sql,sqlite,android-sqlite,Java,Android,Sql,Sqlite,Android Sqlite,任何人都可以看到我的查询中是否有错误,这是我第一次尝试多个连接,下面是logcat错误。提前谢谢 android.database.sqlite.SQLiteException:靠近“FROM”:语法错误 (代码1 SQLITE_错误[1]):,编译时:选择总和(A.quantity), A.配料,A.配方,B.配料类型,B.测量名称,C.id, D.计划名称,从数量A到加入成分A,从数量B到成分A =B.配料\名称加入计划\ A.配方上的配方为C.配方\名称加入膳食\计划为C.id上的D.计划

任何人都可以看到我的查询中是否有错误,这是我第一次尝试多个连接,下面是logcat错误。提前谢谢


android.database.sqlite.SQLiteException:靠近“FROM”:语法错误 (代码1 SQLITE_错误[1]):,编译时:选择总和(A.quantity), A.配料,A.配方,B.配料类型,B.测量名称,C.id, D.计划名称,从数量A到加入成分A,从数量B到成分A =B.配料\名称加入计划\ A.配方上的配方为C.配方\名称加入膳食\计划为C.id上的D.计划\ A.配料的配方组 你的名字在哪里

代码

    public void loadIngredient() {
    shopList.clear();
    db = (new DatabaseManager(this).getWritableDatabase());
    String RECIPE_SEARCH = " SELECT SUM(A.quantity), A.ingredient, A.recipe, B.ingredient_type, B.measurement_name, C.id, D.plan_name, " +
            "FROM " + DatabaseManager.TABLE_QUANTITY + " AS A JOIN " + DatabaseManager.TABLE_INGREDIENTS +
            " AS B ON A.ingredient = B.ingredient_name" + " JOIN " + DatabaseManager.TABLE_PLAN_RECIPES + " AS C ON A.recipe = C.recipe_name " +
            " JOIN " + DatabaseManager.TABLE_MEAL_PLAN + " AS D ON C.id = D.plan_recipe GROUP BY A.ingredient";
    String selectQuery = "";
    selectQuery = RECIPE_SEARCH + " WHERE D.plan_name LIKE ?";
    c = db.rawQuery(selectQuery, new String[]{"%" + search + "%"});
    if (c.moveToFirst()) {
        do {
            Shopping_List shopping_list = new Shopping_List();
            shopping_list.setQuantity(c.getDouble(c.getColumnIndex("quantity")));
            shopping_list.setIngredient_name(c.getString(c.getColumnIndex("ingredient_name")));
            shopping_list.setIngredient_type(c.getString(c.getColumnIndex("ingredient_type")));
            shopping_list.setMeasurement_name(c.getString(c.getColumnIndex("measurement_name")));
            shopList.add(shopping_list);
        } while (c.moveToNext());
        c.close();
    }

}

您的代码中有几个问题。

第一个逗号必须在变量
RECIPE\u SEARCH
中的
FROM
子句前面的
D.plan\u name
后面删除。

第二个是
WHERE
子句,它必须位于
groupby
子句之前。

3d是指您必须为查询返回的列
SUM(A.quantity)
添加别名,以便您可以通过该别名检索该列,例如
quantity

第四个问题是,您的查询没有返回任何列
component\u name
,但我假设这是列
A.component
,它应该别名为
component\u name

因此,请改为:

public void loadIngredient() {
    shopList.clear();
    db = (new DatabaseManager(this).getWritableDatabase());
    String RECIPE_SEARCH = 
        "SELECT SUM(A.quantity) quantity, A.ingredient ingredient_name, A.recipe, B.ingredient_type, B.measurement_name, C.id, D.plan_name " +
        "FROM " + DatabaseManager.TABLE_QUANTITY + " AS A JOIN " + DatabaseManager.TABLE_INGREDIENTS + " AS B ON A.ingredient = B.ingredient_name " + 
        "JOIN " + DatabaseManager.TABLE_PLAN_RECIPES + " AS C ON A.recipe = C.recipe_name " +
        "JOIN " + DatabaseManager.TABLE_MEAL_PLAN + " AS D ON C.id = D.plan_recipe " +
        "WHERE D.plan_name LIKE ? GROUP BY A.ingredient";   
    c = db.rawQuery(RECIPE_SEARCH, new String[]{"%" + search + "%"});

    if (c.moveToFirst()) {
        do {
            Shopping_List shopping_list = new Shopping_List();
            shopping_list.setQuantity(c.getDouble(c.getColumnIndex("quantity")));
            shopping_list.setIngredient_name(c.getString(c.getColumnIndex("ingredient_name")));
            shopping_list.setIngredient_type(c.getString(c.getColumnIndex("ingredient_type")));
            shopping_list.setMeasurement_name(c.getString(c.getColumnIndex("measurement_name")));
            shopList.add(shopping_list);
        } while (c.moveToNext());
    }
    c.close();
    db.close();
}

此外,您的查询返回循环中未使用的列(我没有删除),您可以删除这些列。

删除字符串
RECIPE\u SEARCH
.android.database.sqlite.SQLiteException:靠近“WHERE”:语法错误(代码1 sqlite\u错误[1]):,编译时选择SUM:(A.数量)例如:A.配料,A.配方,B.配料类型,B.测量名称,C.id,D.计划名称从数量中作为A.上的B.配料,A.配料,A.配料,A.配方,B.配料类型,B.配料类型,B.配料类型,B.测量名称,C.id,D.计划名称从A.配料,B.配料,A.配料=B.配料,A.配料,A.配料=B.配料,A.配料,A.配方,A.配方,A.配方=C.配方,C.配方,C.配方,D.计划,A.配料,D.计划,A.配料,D.配料,D.计划,A.配方。无法从包含34行7列的CursorWindow中读取第0行第1列。请参阅我的答案…我仍然无法从CursorWindow中读取第0行第1列。请确保在访问数据之前正确初始化光标。再次检查列名/别名。它们必须与循环中的列完全相同:
quantity、 成分名称、成分类型、测量值名称
。您可以每次删除1个,以确定哪一个不相同。我看不出这些有任何问题。您是否复制了原样的代码?是否尝试从循环中一次删除1列?首先删除
购物列表。setQuantity(c.getDouble(c.getColumnIndex(“quantity”))
并运行。然后删除
购物清单.setComponent\u名称(c.getString(c.getColumnIndex(“Component\u name”));
etcWhy您将别名更改为
成分数量
?在这一行:
购物清单.setQuantity(c.getDouble(c.getColumnIndex(“quantity”));
您正试图用名称
数量
检索它。