Nous créons une application pour un client qui a des centaines de mégaoctets de HTML dans les bases de données SQLite. Nous avons mis en place un moyen d'interroger ces données et de les faire défiler assez rapidement. Le problème est que certaines bases de données ont des requêtes très volumineuses (plus de 20 000 lignes) et que nous observons des erreurs lorsque nous développons les requêtes au fur et à mesure que l'utilisateur défile. Donc, je suppose que la question est, quelles options avons-nous dans l'interrogation et l'affichage de dizaines de milliers de lignes de données dans Android?Android SQLite et d'énormes ensembles de données
Voici le stacktrace que nous voyons:
09-10 19:19:12.575: WARN/IInputConnectionWrapper(640): showStatusIcon on inactive InputConnection
09-10 19:19:18.226: DEBUG/dalvikvm(640): GC freed 446 objects/16784 bytes in 330ms
09-10 19:19:32.886: ERROR/CursorWindow(19416): need to grow: mSize = 1048576, size = 36, freeSpace() = 30, numRows = 17717
09-10 19:19:32.896: ERROR/CursorWindow(19416): not growing since there are already 17717 row(s), max size 1048576
09-10 19:19:32.916: ERROR/CursorWindow(19416): The row failed, so back out the new row accounting from allocRowSlot 17716
09-10 19:19:33.005: ERROR/Cursor(19416): Failed allocating fieldDir at startPos 0 row 17716
09-10 19:19:35.596: DEBUG/Cursor(19416): finish_program_and_get_row_count row 24315
09-10 19:19:41.545: DEBUG/dalvikvm(698): GC freed 2288 objects/126080 bytes in 260ms
09-10 19:19:43.705: WARN/KeyCharacterMap(19416): No keyboard for id 0
09-10 19:19:43.717: WARN/KeyCharacterMap(19416): Using default keymap: /system/usr/keychars/qwerty.kcm.bin
09-10 19:20:04.705: ERROR/CursorWindow(19416): need to grow: mSize = 1048576, size = 17, freeSpace() = 3, numRows = 17094
09-10 19:20:04.716: ERROR/CursorWindow(19416): not growing since there are already 17094 row(s), max size 1048576
09-10 19:20:04.726: ERROR/Cursor(19416): Failed allocating 17 bytes for text/blob at 17093,2
09-10 19:20:05.656: DEBUG/Cursor(19416): finish_program_and_get_row_count row 5257
09-10 19:24:54.685: DEBUG/dalvikvm(637): GC freed 9297 objects/524176 bytes in 247ms
09-10 19:32:07.656: DEBUG/dalvikvm(19416): GC freed 9035 objects/495840 bytes in 199ms
Voici notre code CursorAdapter:
private class MyAdapter extends ResourceCursorAdapter {
public MyAdapter(Context context, Cursor cursor) {
super(context, R.layout.my_row, cursor);
}
public void bindView(View view, Context context, Cursor cursor) {
RowData data = new RowData();
data.setName(cursor.getInt(cursor.getColumnIndex("name")));
TextView tvItemText = (TextView)view.findViewById(R.id.tvItemText);
tvItemText.setText(data.getName());
view.setTag(data);
}
@Override
public Cursor runQueryOnBackgroundThread(CharSequence constraint) {
/* Display the progress indicator */
updateHandler.post(onFilterStart);
/* Run the actual query */
if (constraint == null) {
return myDbObject.getData(null);
}
return myDbObject.getData(constraint.toString());
}
}
« quelles options nous avons dans l'interrogation et l'affichage des dizaines de milliers de lignes de données dans Android? » -> hein? Je ne peux même pas imaginer pourquoi vous pourriez vouloir faire cela. – SK9
@ SK9 Ce fut pour le portage d'une application de référence médicale de l'iPhone à Android. Ils avaient littéralement des dizaines de milliers d'enregistrements dans ces bases de données SQLite. Toute personne sensée commencerait à entrer dans un terme de recherche pour affiner la liste, mais l'application iPhone supportant manuellement le défilement de toutes les données parfaitement bien aussi. Ainsi, ils s'attendaient à ce que l'application Android se comporte de la même manière. – MattC
J'ai une exigence similaire. On serait étonné de voir combien d'organisations utilisent des applications spécialisées de cette manière. – gonzobrains