2014-02-06 54 views
0

請幫我解決這個問題。我正在開發一個應用程序,它可以在android中使用大型數據庫。問題是我需要做大的程序才能獲得某些特定的信息,但是應用程序需要很長的時間來響應,屏幕會變黑,直到解決問題。我找到答案時放了一個AsyncTask,但似乎沒有任何工作。如何正確處理SQLlite中的select語句for android?

這是一個示例方法。

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; 
} 

回答

0

謝謝大家!我解決了我的問題,只是嘗試將所有選擇都放在一箇中,因爲它會打開大量內存並關閉遊標。

1

爲了在Android中處理龐大的SQLite數據庫,您必須使用Custom Loaders。它提高了數據庫性能。

瞭解裝載機檢查的概念this。要實施它,請檢查此tutorial以設置Custom loaders或者您可以在此Video中找到更多關於它的信息。

希望這對你有用。