请在这个问题上帮助我。我正在开发一个与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;
}
答案 0 :(得分:1)
为了在Android中处理庞大的SQLite数据库,您必须使用Custom Loaders
。它提高了数据库性能。
了解装载机检查this的概念。要实现它,请查看此tutorial以设置Custom loaders
,或者您可以在此Video中找到有关它的更多信息。
希望这适合你。
答案 1 :(得分:0)
谢谢大家!我解决了我的问题,只尝试将所有选择合二为一,因为它占用大量内存并关闭游标。