如何在SQLite for android中正确处理select语句?

时间:2014-02-06 01:56:04

标签: android database performance sqlite

请在这个问题上帮助我。我正在开发一个与android中的大型数据库一起工作的应用程序。问题是我需要做大程序来获取一些特定的信息,但是应用程序需要很长时间才能响应,屏幕会变黑,直到解决问题为止。我在发现响应时放了一个AsyncTask,但似乎没什么用。

这是一个示例方法。

public ArrayList<SGN_PROMOCIONES> SearchPromos(int p_cabped_id,
        int p_agrup_id, int cli_id) {
    int li_aplica = 0;
    int li_nro_agrup;
    // le asignamos por el momento el id del cliente que seleccionamos
    InformacionProceso inP = new InformacionProceso();
    int ld_clie_id = 0;
    int ld_promo_id;
    int ld_promo_id1;
    String lv_descripcion_corta;
    char lv_aplica_a;
    String lv_aplica_aS;
    String lv_indicador_evaluar;
    String lv_indicador_articulo_evaluar;
    String lv_otorga_puntos;
    String lv_indicador_obsequio;
    int ld_maximo_obsequio;
    String ld_indicador_aleatorio_id;
    String lv_estado;
    String lv_actividad;
    String lv_canal;
    String lv_subcanal;
    String lv_automatica_sn;

    Cursor c = db
            .rawQuery(
                    "SELECT id,descripcion_corta,aplica_a,indicador_evaluar,indicador_articulo_evaluar,otorga_puntos,indicador_obsequio,maximo_obsequio,indicador_aleatorio_id,automatica_sn FROM sgn_promociones ORDER BY id;",
                    null);
    if (c.moveToFirst()) {
        do {
            li_aplica = 0;
            ld_clie_id = cli_id;
            ld_promo_id = c.getInt(0);
            lv_descripcion_corta = c.getString(1);
            lv_aplica_aS = c.getString(2);
            lv_indicador_evaluar = c.getString(3);
            lv_indicador_articulo_evaluar = c.getString(4);
            lv_otorga_puntos = c.getString(5);
            lv_indicador_obsequio = c.getString(6);
            ld_maximo_obsequio = c.getInt(7);
            ld_indicador_aleatorio_id = c.getString(8);
            lv_automatica_sn = c.getString(9);

            ld_promo_id1 = 0;

            String s1 = "SELECT DISTINCT sg_promo_id FROM sgn_bitacoras_promocion WHERE sg_cabped_id = "
                    + p_cabped_id
                    + " AND sg_promo_id = "
                    + ld_promo_id
                    + " AND estado = 'IUS' AND activo_inactivo = 'A'";
            Cursor c1 = db.rawQuery(s1, null);

            if (c1.moveToFirst()) {
                ld_promo_id1 = c1.getInt(0);
            } else {
                ld_promo_id1 = 0;
            }
            c1.close();

            if (ld_promo_id1 == 0)
                lv_estado = "I";
            else
                lv_estado = "A";

            lv_aplica_a = lv_aplica_aS.charAt(0);
            switch (lv_aplica_a) {

            case 'T':
                s1 = "SELECT COUNT(a.nomenclatura) FROM sgn_rutas a,sgn_territorios b,sgn_padrones c,sgn_target_promocion d WHERE a.sg_terri_id = b.id AND a.nomenclatura = c.sg_ruta_nomenclatura AND d.id = b.id AND d.sg_promo_id = "
                        + ld_promo_id + " AND c.sg_clie_id =" + ld_clie_id;
                c1 = db.rawQuery(s1, null);
                if (c1.moveToFirst()) {
                    li_aplica = c1.getInt(0);
                } else {
                    li_aplica = 0;
                }
                c1.close();
                break;

            case 'R':
                s1 = "SELECT COUNT(a.nomenclatura) FROM sgn_rutas a,sgn_padrones b,sgn_target_promocion c WHERE a.nomenclatura = b.sg_ruta_nomenclatura AND c.id = a.nomenclatura AND c.sg_promo_id = "
                        + ld_promo_id + " AND b.sg_clie_id = " + ld_clie_id;
                c1 = db.rawQuery(s1, null);
                if (c1.moveToFirst()) {
                    li_aplica = c1.getInt(0);
                } else {
                    li_aplica = 0;
                }
                c1.close();
                break;

            case 'N':
                s1 = "SELECT COUNT(cl.id) FROM sgn_clientes cl,sgn_target_promocion tp WHERE cl.id = "
                        + ld_clie_id
                        + " AND cl.sg_nac_actividad = SUBSTRING(tp.id,1,1) AND cl.sg_nac_canal = SUBSTRING(tp.id,2,3) AND cl.sg_nac_subcanal = SUBSTRING(tp.id,5,3) AND tp.sg_promo_id = "
                        + ld_promo_id;
                c1 = db.rawQuery(s1, null);
                if (c1.moveToFirst()) {
                    li_aplica = c1.getInt(0);
                } else {
                    li_aplica = 0;
                }
                c1.close();
                break;

            case 'C':
                s1 = "SELECT COUNT(id) FROM sgn_target_promocion WHERE sg_promo_id = "
                        + ld_promo_id + " AND id = " + ld_clie_id;
                c1 = db.rawQuery(s1, null);
                if (c1.moveToFirst()) {
                    li_aplica = c1.getInt(0);
                } else {
                    li_aplica = 0;
                }
                c1.close();
                break;

            case 'I':
                s1 = "SELECT COUNT(a.nomenclatura) FROM sgn_rutas a,sgn_padrones b,sgn_target_promocion c WHERE a.nomenclatura = b.sg_ruta_nomenclatura AND c.id = a.sg_tiprut_tipo AND c.sg_promo_id = "
                        + ld_promo_id + " AND b.sg_clie_id = " + ld_clie_id;
                c1 = db.rawQuery(s1, null);
                if (c1.moveToFirst()) {
                    li_aplica = c1.getInt(0);
                } else {
                    li_aplica = 0;
                }
                c1.close();
                break;

            case 'P':
                s1 = "SELECT COUNT(a.sg_clie_id) FROM sgn_clientes_plan_comercial a,sgn_target_promocion c WHERE a.sg_clie_id = "
                        + ld_clie_id
                        + " AND c.id = a.sg_placom_id AND c.sg_promo_id = "
                        + ld_promo_id;
                c1 = db.rawQuery(s1, null);
                if (c1.moveToFirst()) {
                    li_aplica = c1.getInt(0);
                } else {
                    li_aplica = 0;
                }
                c1.close();
                break;

            case '*':
                li_aplica = 1;
                break;
            }
            if (li_aplica > 0) {
                if (p_agrup_id == 0
                        || lv_indicador_articulo_evaluar.equals("P")) {
                    s1 = "INSERT INTO TempSGN_PEDIDOS VALUES("
                            + ld_promo_id + ", '" + lv_descripcion_corta
                            + "' ,'" + lv_estado + "' ,'"
                            + lv_indicador_evaluar + "' ,'"
                            + lv_indicador_articulo_evaluar + "' ,'"
                            + lv_indicador_obsequio + "' ,"
                            + ld_maximo_obsequio + " ,'" + lv_otorga_puntos
                            + "' ,'" + lv_automatica_sn + "')";
                    db.execSQL(s1);
                } else if (lv_indicador_articulo_evaluar.equals("I")) {
                    s1 = "SELECT COUNT(epr.id) FROM sgn_promociones pr,sgn_evaluar_promocion epr,sgn_agrupamientos_articulo aa WHERE pr.id = epr.sg_promo_id AND epr.id = aa.articulo_id AND aa.sg_detagr_id = "
                            + p_agrup_id + " AND pr.id = " + ld_promo_id;
                    c1 = db.rawQuery(s1, null);
                    if (c1.moveToFirst()) {
                        li_aplica = c1.getInt(0);
                    } else {
                        li_aplica = 0;
                    }
                    c1.close();
                    if (li_aplica > 0) {
                        s1 = "INSERT INTO TempSGN_PEDIDOS VALUES("
                                + ld_promo_id + ", '"
                                + lv_descripcion_corta + "' ,'" + lv_estado
                                + "' ,'" + lv_indicador_evaluar + "' ,'"
                                + lv_indicador_articulo_evaluar + "' ,'"
                                + lv_indicador_obsequio + "' ,"
                                + ld_maximo_obsequio + " ,'"
                                + lv_otorga_puntos + "' ,'"
                                + lv_automatica_sn + "')";
                        db.execSQL(s1);
                    }
                } else if (lv_indicador_articulo_evaluar.equals("A")) {
                    s1 = "SELECT COUNT(epr.id) FROM sgn_promociones pr,sgn_evaluar_promocion epr WHERE pr.id = epr.sg_promo_id AND pr.id = "
                            + ld_promo_id;
                    c1 = db.rawQuery(s1, null);
                    if (c1.moveToFirst()) {
                        li_nro_agrup = c1.getInt(0);
                    } else {
                        li_nro_agrup = 0;
                    }
                    c1.close();
                    s1 = "SELECT art.id,art.descripcion_corta,COUNT(epr.id) nro_grupos FROM sgn_promociones pr,sgn_evaluar_promocion epr,"
                            + "sgn_agrupamientos_articulo aa,articulos art WHERE pr.id = epr.sg_promo_id AND epr.id = aa.sg_detagr_id AND aa.articulo_id = art.id AND aa.articulo_id IN( SELECT articulo_id "
                            + "FROM sgn_agrupamientos_articulo WHERE sg_detagr_id = "
                            + p_agrup_id
                            + ") AND pr.id = "
                            + ld_promo_id
                            + " GROUP BY art.id,art.descripcion_corta";
                    int nroGruposT = 0;
                    Cursor c21 = db.rawQuery(s1, null);
                    if (c21.moveToFirst()) {
                        do {
                            if (c21.getInt(2) == li_nro_agrup) {
                                nroGruposT++;
                            }
                        } while (c21.moveToNext());
                    }
                    li_aplica = nroGruposT;
                    c21.close();
                    if (li_aplica > 0) {
                        s1 = "INSERT INTO TempSGN_PEDIDOS VALUES("
                                + ld_promo_id + ", '"
                                + lv_descripcion_corta + "' ,'" + lv_estado
                                + "' ,'" + lv_indicador_evaluar + "' ,'"
                                + lv_indicador_articulo_evaluar + "' ,'"
                                + lv_indicador_obsequio + "' ,"
                                + ld_maximo_obsequio + " ,'"
                                + lv_otorga_puntos + "' ,'"
                                + lv_automatica_sn + "')";
                        db.execSQL(s1);
                    }
                }
            }

        } while (c.moveToNext());
    }
    ArrayList<SGN_PROMOCIONES> promociones = new ArrayList<SGN_PROMOCIONES>();
    Cursor c3 = db.rawQuery("Select * from TempSGN_PEDIDOS ORDER BY DESCRIPCION_CORTA", null);
    if (c3.moveToFirst()) {
        do {
            SGN_PROMOCIONES promo = new SGN_PROMOCIONES();
            promo.setID(c3.getInt(0));
            promo.setDESCRIPCION_CORTA(c3.getString(1));
            promo.setESTADO(c3.getString(2));
            promo.setINDICADOR_EVALUAR(c3.getString(3));
            promo.setINDICADOR_ARTICULO_EVALUAR(c3.getString(4));
            promo.setOTORGA_PUNTOS(c3.getString(5));
            promo.setINDICADOR_OBSEQUIO(c3.getString(6));
            promo.setMAXIMO_OBSEQUIO(c3.getInt(7));
            promo.setAUTOMATICA_SN(c3.getString(8));

            promociones.add(promo);
        } while (c3.moveToNext());
    }

    return promociones;
}

2 个答案:

答案 0 :(得分:1)

为了在Android中处理庞大的SQLite数据库,您必须使用Custom Loaders。它提高了数据库性能。

了解装载机检查this的概念。要实现它,请查看此tutorial以设置Custom loaders,或者您可以在此Video中找到有关它的更多信息。

希望这适合你。

答案 1 :(得分:0)

谢谢大家!我解决了我的问题,只尝试将所有选择合二为一,因为它占用大量内存并关闭游标。