SQLite查询没有正确地获取参数

时间:2015-02-20 12:55:26

标签: android database sqlite

我试图在我的Android应用中进行SQLite查询,但由于某种原因,它无法正确获取参数。如果我对值进行硬编码,那么查询就可以了,所以我知道整个查询是正确的,数据就在那里。

...
public String[][] traerEncuestaPostventa(int idBien,
    int idEncuesta)
{

    String[][] arrayDatos = null;

    String[] arrayArgumentos = {String.valueOf(idBien), String.valueOf(idEncuesta), String.valueOf(idBien)};

    Cursor cursor = null;

    cursor = querySQL("SELECT " +
        "encuestadetalle.id_encuestadetalle," +
        "IFNULL(encuestapostventa.id_encuestapostventa, 0) as id_encuestapostventa," +
        "encuestadetalle.zona_inmueble," +
        "encuestadetalle.tarea," +
        "IFNULL(encuestaobservacion.id_encuestaobservacion, 0) as id_encuestaobservacion," +
        "IFNULL(encuestaobservacion.observacion, '') as observacion," +
        "encuestadetalle.id_encuesta," +
        "IFNULL(encuestapostventa.recepcion, 0) as recepcion" +
        " FROM encuestadetalle" +
        " LEFT JOIN (SELECT * FROM encuestapostventa WHERE id_bien = ?) AS encuestapostventa" +
        " ON encuestadetalle.id_encuestadetalle = encuestapostventa.id_encuestadetalle" +
        " LEFT JOIN encuestaobservacion" +
        " ON encuestapostventa.id_encuestapostventa = encuestaobservacion.id_encuestapostventa" +
        " WHERE encuestadetalle.id_encuesta = ?" +
        " AND (IFNULL(encuestapostventa.id_bien, 0) IN (?, 0))" +
        " ORDER BY encuestadetalle.zona_inmueble, encuestadetalle.tarea", arrayArgumentos);

    if(cursor.getCount() > 0)
    {
        int i = 0;
        arrayDatos = new String[cursor.getCount()][5];

        while(cursor.moveToNext())
        {
            //Here I handle the data;

            i = i + 1;
        }
    }

    cursor.close();
    CloseDB();
    return(arrayDatos);
}

...

public Cursor querySQL(String sql, String[] selectionArgs)
{
    Cursor oRet = null;
    // Opens the database object in "write" mode.
    db = oDB.getReadableDatabase();
    oRet = db.rawQuery(sql, selectionArgs);
    return(oRet);
}
...

现在,如果我像这样替换查询,它可以工作:

    cursor = querySQL("SELECT " +
        "encuestadetalle.id_encuestadetalle," +
        "IFNULL(encuestapostventa.id_encuestapostventa, 0) as id_encuestapostventa," +
        "encuestadetalle.zona_inmueble," +
        "encuestadetalle.tarea," +
        "IFNULL(encuestaobservacion.id_encuestaobservacion, 0) as id_encuestaobservacion," +
        "IFNULL(encuestaobservacion.observacion, '') as observacion," +
        "encuestadetalle.id_encuesta," +
        "IFNULL(encuestapostventa.recepcion, 0) as recepcion" +
        " FROM encuestadetalle" +
        " LEFT JOIN (SELECT * FROM encuestapostventa WHERE id_bien = 5813) AS encuestapostventa" +
        " ON encuestadetalle.id_encuestadetalle = encuestapostventa.id_encuestadetalle" +
        " LEFT JOIN encuestaobservacion" +
        " ON encuestapostventa.id_encuestapostventa = encuestaobservacion.id_encuestapostventa" +
        " WHERE encuestadetalle.id_encuesta = 3" +
        " AND (IFNULL(encuestapostventa.id_bien, 0) IN (5813, 0))" +
        " ORDER BY encuestadetalle.zona_inmueble, encuestadetalle.tarea", null);

我也尝试替换arrayArgumentos中的元素,但它也没有用:

    String[] arrayArgumentos = {String.valueOf(5813), String.valueOf(3), String.valueOf(5813)};

我猜它与我的数组是String []并且参数本身是整数这一事实有关。我该如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

试试这个:

String[] arrayArgumentos = {String.valueOf(idBien)};

    Cursor cursor = null;

String sql="SELECT " +
        "encuestadetalle.id_encuestadetalle," +
        "IFNULL(encuestapostventa.id_encuestapostventa, 0) as id_encuestapostventa," +
        "encuestadetalle.zona_inmueble," +
        "encuestadetalle.tarea," +
        "IFNULL(encuestaobservacion.id_encuestaobservacion, 0) as id_encuestaobservacion," +
        "IFNULL(encuestaobservacion.observacion, '') as observacion," +
        "encuestadetalle.id_encuesta," +
        "IFNULL(encuestapostventa.recepcion, 0) as recepcion" +
        " FROM encuestadetalle" +
        " LEFT JOIN (SELECT * FROM encuestapostventa WHERE id_bien ="+String.valueOf(idBien)+ ") AS encuestapostventa" +
        " ON encuestadetalle.id_encuestadetalle = encuestapostventa.id_encuestadetalle" +
        " LEFT JOIN encuestaobservacion" +
        " ON encuestapostventa.id_encuestapostventa = encuestaobservacion.id_encuestapostventa" +
        " WHERE encuestadetalle.id_encuesta ="+String.valueOf(idEncuesta)+"" +
        " AND (IFNULL(encuestapostventa.id_bien, 0) IN (?, 0))" +
        " ORDER BY encuestadetalle.zona_inmueble, encuestadetalle.tarea"

cursor = querySQL(sql, arrayArgumentos);

Log.d("For DEBUG", "Sql String -->"+sql)

尝试将一些参数直接放在查询上。

然后打印您的查询以使用Log语句检查发送到数据库的内容。 问题可能出在论点上。还要记住,当等于SQL中的String时,你应该使用''。希望这会有所帮助。

答案 1 :(得分:0)

给出参数的正确格式为

rawQuery("SELECT id, name FROM people WHERE name = ? AND id = ?", new String[] {"David", "2"});

检查是否使用类似

的硬编码值
...." ORDER BY encuestadetalle.zona_inmueble, encuestadetalle.tarea",  new String[] {"5813", "3","5813"});