Refaktoring – Złączenie (concat) po stronie bazy – #21

Ciągle pracuję nad lepszym GUI i przy okazji poprawiam kod. Znajduję miejsca, które niespecjalnie mi się podobają i przerabiam. Dużo pracy przede mną 😉 Na przykład to: skoro już wysyłam zapytanie do bazy, to przydałoby się na tym jak najwięcej ugrać.

Pierwotnie kod, który tworzył listę zakupów wyglądał tak:


private String getShoppingListQuery(List<Meal> meals) {
StringBuffer sb = new StringBuffer();
sb.append("select name, count(name) from (");
for (int i = 0; i < meals.size(); i++) {
sb.append(getIngredientsQuery());
if (i < meals.size() – 1) {
sb.append(" union all ");
}
}
sb.append(") group by name order by name collate nocase;");
return sb.toString();
}

Zwykły select ze zliczaniem ile razy name pojawiło się na liście składników. W podzapytaniu query odpytujące bazę o listę składników do każdego obiadu połączone 'union all’, żeby nie usunęło z wyników powtarzających się składników.

Jak już wypluje te składniki i ich liczbę to trzeba to wrzucić na listę:


Cursor res = db.rawQuery(query, queryArgs);
if (res != null && res.getCount() > 0) {
res.moveToFirst();
do {
String name = res.getString(0);
int count = res.getInt(1);
array_list.add(count + " x " + name + "\n");
} while (res.moveToNext());
}

Weź wartość z pierwszej kolumny, weź z drugiej, połącz to w zgrabnego stringa i wrzuć na listę. Ale ten zgrabny string można stworzyć już po stronie bazy, zawsze to mniej operacji 🙂


private String getShoppingListQuery(List<Meal> meals) {
StringBuffer sb = new StringBuffer();
sb.append("select no || ' x ' || name from ( select name, count(name) as no from (");
for (int i = 0; i < meals.size(); i++) {
sb.append(getIngredientsQuery());
if (i < meals.size() – 1) {
sb.append(" union all ");
}
}
sb.append(") group by name order by name collate nocase);");
return sb.toString();
}

Do złączenia wartości kolumn ze stringiem użyłam operatora ||. Dzięki tej operacji baza daje mi od razu to czego potrzebuję bez zabaw po stronie Javy. Więc potem wystarczy już tylko tyle:


Cursor res = db.rawQuery(query, queryArgs);
if (res != null && res.getCount() > 0) {
res.moveToFirst();
do {
array_list.add(res.getString(0));
} while (res.moveToNext());
}

a lista wygląda tak samo w jednym i drugim przypadku:

wp-1496905412973.

Pod spodem już wychyla się nowe GUI, ale jeszcze dużo przed nim 😉

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

This site uses Akismet to reduce spam. Learn how your comment data is processed.