Jaki byłby rozsądny sposób dodawania zapytań opartych na DISTINCT
i/lub do na . Teraz muszę utworzyć niestandardowy identyfikator URI dla każdego przypadku specjalnego. Czy istnieje lepszy sposób? (Nadal programuję dla 1,5 jako najniższy wspólny mianownik)Android: Odrębny i GroupBy w ContentResolver
Odpowiedz
Ponieważ nikt nie przyszedł odpowiedzieć, po prostu powiem, jak to rozwiązałem. Zasadniczo chciałbym utworzyć niestandardowy identyfikator URI dla każdego przypadku i spełnić kryteria w parametrze selection
. Następnie wewnątrz ContentProvider#query
chciałbym zidentyfikować sprawę i skonstruować surowe zapytanie oparte na nazwie tabeli i parametrze wyboru.
Oto krótki przykład:
switch (URI_MATCHER.match(uri)) {
case TYPES:
table = TYPES_TABLE;
break;
case TYPES_DISTINCT:
return db.rawQuery("SELECT DISTINCT type FROM types", null);
default:
throw new IllegalArgumentException("Unknown URI " + uri);
}
return db.query(table, null, selection, selectionArgs, null, null, null);
można zrobić piękny siekać podczas odpytywania contentResolver, przeznaczenie:
String selection = Models.SOMETHING + "=" + something + ") GROUP BY (" + Models.TYPE;
W swojej zamienione na ContentProvider
metody zapytań mają szczególne odwzorowanie URI do korzystania odrębne.
Następnie użyj SQLiteQueryBuilder
i zadzwoń na metodę setDistinct(boolean)
.
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder)
{
SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
boolean useDistinct = false;
switch (sUriMatcher.match(uri))
{
case YOUR_URI_DISTINCT:
useDistinct = true;
case YOUR_URI:
qb.setTables(YOUR_TABLE_NAME);
qb.setProjectionMap(sYourProjectionMap);
break;
default:
throw new IllegalArgumentException("Unknown URI " + uri);
}
// If no sort order is specified use the default
String orderBy;
if (TextUtils.isEmpty(sortOrder))
{
orderBy = DEFAULT_SORT_ORDER;
}
else
{
orderBy = sortOrder;
}
// Get the database and run the query
SQLiteDatabase db = mDBHelper.getReadableDatabase();
// THIS IS THE IMPORTANT PART!
qb.setDistinct(useDistinct);
Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, orderBy);
if (c != null)
{
// Tell the cursor what uri to watch, so it knows when its source data changes
c.setNotificationUri(getContext().getContentResolver(), uri);
}
return c;
}
co to jest mDBHelper? – Hamidreza
Być może jest to bardziej proste, aby uzyskać różne wartości, spróbować dodać DISTINCT słowo przed nazwą kolumny chcesz do stołu projekcyjnego
String[] projection = new String[]{
BaseColumns._ID,
"DISTINCT "+ Mediastore.anything.you.want
};
i używać go jako argumentu do kwerendy metody resolver zawartości!
mam nadzieję pomóc, bo mam to samo pytanie kilka dni przed
To nie działa dla mnie. My Kod: \t \t ciąg [] = projekcja nowy ciąg [] { "różny" \t \t \t \t + ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME}; \t \t kursora bież = cr.query ( \t \t \t \t ContactsContract.CommonDataKinds.Phone.CONTENT_URI, odwzorowanie \t \t \t \t "długość (" + ContactsContract.CommonDataKinds.Phone.NUMBER \t \t \t \t \t \t + ")> = 8", null, sortOrder); Otrzymuję niepoprawną kolumnę DISTINCT display_name – Maurice
Pozwala spróbować dodać spację w "DISTINCT" -> "DISTINCT"; Na tym blogu http://javment.blogspot.com/2011/07/how-to-get-distinct-values-from-android.html Zrobiłem prosty tutorial na ten temat, może ci pomóc. – javment
To nie działa dla mnie. Nawet przy przestrzeni –
w niektórych warunkach, możemy użyć „odrębny (COLUMN_NAME)” jako wybór, i to działało idealnie. ale w niektórych warunkach spowoduje to wyjątek.
kiedy to spowodować wyjątek, użyję HashSet do przechowywania wartości kolumny ....
Jeśli chcesz korzystać z DISTINCT wybrać więcej niż jedną kolumnę, trzeba użyć GROUP BY.
Mini Hack nad ContentResolver.query do stosowania tego:
Uri uri = Uri.parse("content://sms/inbox");
Cursor c = getContentResolver().query(uri,
new String[]{"DISTINCT address","body"}, //DISTINCT
"address IS NOT NULL) GROUP BY (address", //GROUP BY
null, null);
if(c.moveToFirst()){
do{
Log.v("from", "\""+c.getString(c.getColumnIndex("address"))+"\"");
Log.v("text", "\""+c.getString(c.getColumnIndex("body"))+"\"");
} while(c.moveToNext());
}
Ten kod Wybierz jedną ostatnią SMS dla każdego z nadawców ze skrzynki odbiorczej urządzenia.
Uwaga: przed GROUP BY zawsze musimy zapisać co najmniej jeden warunek. wyniku zapytania SQL ciąg wewnątrz metody ContentResolver.query będzie:
SELECT DISTINCT address, body FROM sms WHERE (type=1) AND (address IS NOT NULL) GROUP BY (address)
Dzięki! uratowałeś mi życie :) –
Choć nie użyłem Grupa Poprzez, Użyłem odrębne w treści zapytania przelicznika.
Cursor cursor = contentResolver .query(YOUR_URI, new String[] {"Distinct "+ YOUR_COLUMN_NAME}, null, null, null);
działa poprawnie dzięki –
// getting sender list from messages into spinner View
Spinner phoneListView = (Spinner) findViewById(R.id.phone_list);
Uri uri = Uri.parse("content://sms/inbox");
Cursor c = getContentResolver().query(uri, new String[]{"Distinct address"}, null, null, null);
List <String> list;
list= new ArrayList<String>();
list.clear();
int msgCount=c.getCount();
if(c.moveToFirst()) {
for(int ii=0; ii < msgCount; ii++) {
list.add(c.getString(c.getColumnIndexOrThrow("address")).toString());
c.moveToNext();
}
}
phoneListView.setAdapter(new ArrayAdapter<String>(BankActivity.this, android.R.layout.simple_dropdown_item_1line, list));
lepiej wytłumaczyć swoją odpowiedź –
Dodawanie DISTINCT w projekcji pracował dla mnie zbyt jednak, że działa tylko wtedy, gdy DISTINCT był pierwszy argument:
String[] projection = new String[]{"DISTINCT " + DBConstants.COLUMN_UUID, ... };
- 1. Używanie ContentResolver
- 2. Połączyć group_by i odrębny
- 3. SQL odrębny i liczyć
- 4. różnica między dict (GroupBy) i GroupBy
- 5. Pandy groupby i Multiindex
- 6. LINQ GroupBy i agregatów
- 7. Android - SQLite ContentResolver wstawić/usunąć/zaktualizować wątek interfejsu użytkownika?
- 8. Jak mogę filtrować obiekt Pandas GroupBy i odzyskać obiekt GroupBy?
- 9. Oracle SQL select odrębny
- 10. C# Groupby Linq i foreach
- 11. LINQ: GroupBy, Sum i liczyć
- 12. GroupBy z elementemSelector i resultSelector
- 13. Jak mogę GroupBy tego kwerendy LINQ?
- 14. Boxplot z pand i GroupBy
- 15. Kryteria JPA Query odrębny
- 16. Warunkowe GroupBy() w LINQ
- 17. GroupBy w wyrażeniach lambda
- 18. Parallel odrębny licznik słowo Przejdź
- 19. Tworzenie nowej listy odtwarzania przy użyciu ContentResolver
- 20. LINQ Odrębny operator, ignoruj sprawę?
- 21. Jak wybrać odrębny konkretnych kolumn
- 22. Jak używać "odrębny" w modelu zend db
- 23. Spark: Jak tłumaczyć count (odrębny (wartość)) w API Dataframe API
- 24. groupby wiele wartości i wyniki kreślenia
- 25. GroupBy i IEqualityComparer <TKey> comparer
- 26. pandy - GroupBy i filtrowania dla kolejnych wartości
- 27. NotSupportedException z zapytaniem linq i groupBy
- 28. pandy GroupBy i konwertować do listy json
- 29. EF7 i GroupBy() nie może być tłumaczone
- 30. kątowa ng-powtórzyć GroupBy i utrzymać porządek
tej pracy tylko wtedy, gdy masz ręka dostawcy ... – njzk2
@ njzk2 Jeśli dobrze cię rozumiem, mówisz, że można uzyskać instancję db danych kontaktów? –
@Ilya_Gazman nie, mówię, że to rozwiązanie działa tylko wtedy, gdy jesteś tym, który wdraża dostawcę zawartości. – njzk2