我有一个不是很大的真值数据库,为listview适配器创建一个类,我在其中显示一个图像和一个人的名字。我的问题是加载速度非常慢,加载5条记录需要大约2到5分钟,在其他情况下,数据库最多可以有1000条数据,这将是非常有问题的。我留下了这些类以及它们如何加载以查看我是否可以提供帮助,或者是否有其他元素来替换它。
public void cargarListView(){
nueva = new database();
SessionManager manager = new SessionManager();
codigoEvento = manager.getValue(this,"codigoEvento");
codigoUser = manager.getValue(this, "codigoUser");
idInscripcionesDisponibles = nueva.inscripcionesEvento(this, codigoEvento);
inscripcionesDisponibles = new String[idInscripcionesDisponibles.length];
for (int i = 0; i < idInscripcionesDisponibles.length; i++) {
if (manager.getValue(listasAsistentes.this, "checkin")!=null){
codigo_checkin = nueva.codigoCheckin(listasAsistentes.this, manager.getValue(listasAsistentes.this, "checkin"));
if(nueva.checkinValidado(listasAsistentes.this, idInscripcionesDisponibles[i], codigo_checkin)>0){
inscripcionesDisponibles[i] = nueva.nombreInscripcion(this, idInscripcionesDisponibles[i], codigoEvento);
RowItem item = new RowItem(images[0], inscripcionesDisponibles[i],Integer.parseInt(idInscripcionesDisponibles[i]));
rowItems.add(item);
}else{
inscripcionesDisponibles[i] = nueva.nombreInscripcion(this, idInscripcionesDisponibles[i], codigoEvento);
RowItem item = new RowItem(images[1], inscripcionesDisponibles[i],Integer.parseInt(idInscripcionesDisponibles[i]));
rowItems.add(item);
}
}else{
if(nueva.validadoInscripcion(listasAsistentes.this, idInscripcionesDisponibles[i], codigoEvento).equals("1")){
inscripcionesDisponibles[i] = nueva.nombreInscripcion(this, idInscripcionesDisponibles[i], codigoEvento);
RowItem item = new RowItem(images[0], inscripcionesDisponibles[i],Integer.parseInt(idInscripcionesDisponibles[i]));
rowItems.add(item);
}else{
inscripcionesDisponibles[i] = nueva.nombreInscripcion(this, idInscripcionesDisponibles[i], codigoEvento);
RowItem item = new RowItem(images[1], inscripcionesDisponibles[i],Integer.parseInt(idInscripcionesDisponibles[i]));
rowItems.add(item);
}
}
}
}
public void cargarLista(){
nueva = new database();
SessionManager manager = new SessionManager();
codigoEvento = manager.getValue(this,"codigoEvento");
codigoUser = manager.getValue(this, "codigoUser");
checkin = (TextView) findViewById(R.id.textView6);
nombreEventoTxt = (TextView) findViewById(R.id.textView3);
sincronizarBD= (Button) findViewById(R.id.button1);
nombreEvento = manager.getValue(this, "nombreEvento");
nombreEventoTxt.setText(nombreEvento);
if (manager.getValue(listasAsistentes.this, "checkin")!=null){
checkin.setText("Check-In: "+nueva.nombreCheckin(listasAsistentes.this, manager.getValue(listasAsistentes.this, "checkin")));
}else{
checkin.setText("Check-In: General");
}
System.out.println("ITEMS : "+rowItems.size());
inputSearch = (EditText) findViewById(R.id.EditText01);
if(rowItems.size() <1){
sincronizarBD.setVisibility(View.VISIBLE);
inputSearch.setVisibility(View.GONE);
RelativeLayout rl = (RelativeLayout) findViewById(R.id.linearLayout1);
noHayAsistentes = new TextView(listasAsistentes.this);
noHayAsistentes.setText("No existen asistentes descargados, por favor sincronizar.");
RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams((int)LayoutParams.WRAP_CONTENT, (int)LayoutParams.WRAP_CONTENT);
params.topMargin = 300;
params.leftMargin = 10;
noHayAsistentes.setGravity(Gravity.CENTER);
noHayAsistentes.setTextSize((float) 14);
noHayAsistentes.setLayoutParams(params);
rl.addView(noHayAsistentes);
}else{
inputSearch.setVisibility(View.VISIBLE);
listView = (ListView) findViewById(R.id.listView1);
adapter = new CustomListViewAdapter(this,R.layout.lista, rowItems);
listView.setAdapter(adapter);
inputSearch.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
cs = cs.toString().toLowerCase();
cs = cs.toString().replace ('á','a');
cs = cs.toString().replace ('é','e');
cs = cs.toString().replace ('í','i');
cs = cs.toString().replace ('ó','o');
cs = cs.toString().replace ('ú','u');
listasAsistentes.this.adapter.getFilter().filter(cs.toString().trim());
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
int arg3) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable arg0) {
// TODO Auto-generated method stub
}
});
adapter = new CustomListViewAdapter(this,
R.layout.lista, rowItems);
listView.setAdapter(adapter);
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
long id) {
listasAsistentes.this.adapter.getItem(position);
System.out.println("ID ITEM:"+listasAsistentes.this.adapter.getItem(position).getInscripcionId());
SessionManager manager = new SessionManager();
//String idSeleccionada = idInscripcionesDisponibles[position];
manager.setValue(listasAsistentes.this,"idInscripcionSeleccionada", String.valueOf(listasAsistentes.this.adapter.getItem(position).getInscripcionId()));
nueva.inscripcionSeleccionada(listasAsistentes.this, String.valueOf(listasAsistentes.this.adapter.getItem(position).getInscripcionId()));
menu();
}
});
}
}
答案 0 :(得分:1)
让我猜你没有正确地 INDEX 你的字段。
至少那些属于 JOIN 的字段和属于 WHERE 条件的字段必须编入索引。
你会获得明显的性能提升,最快可达 100s 倍(我的速度增加约 350x ,根据经验确定)。
要了解如何索引字段,我建议您使用这个非常好的教程:http://www.tutorialspoint.com/sqlite/sqlite_indexes.htm
用糟糕的词语(该教程中非常合成的摘录),
在创建表后添加这些说明:
CREATE INDEX index_name ON table_name (column_name);
为您要创建的每个索引
通过使用IF NOT EXISTS
构造,您将避免重新创建索引(如果已存在)。
即:
CREATE INDEX IF NOT EXISTS idxID ON your_table_name (_id);
CREATE INDEX IF NOT EXISTS idxSearch ON your_table_name (a_field_used_in_searches);