2010-07-24 26 views
14

Mam niestandardowego dostawcę treści, którego używam do przechowywania poprawek uzyskanych z GPS w bazie danych SQLite. Ta klasa nadpisuje metody ContentProvider (delete, insert, query ...), ale zauważ, że dodałem również metodę sprawdzania ostatniej poprawki.Android: wywoływanie metod niestandardowych w ContentProvider

public class FixesContentProvider extends ContentProvider { 
    @Override 
    public int delete(...) { ... } 
    ... 
    @Override 
    public Cursor query(...) { ... } 

    public Cursor getLastFix(Uri uri) { ... } 
} 

Jest to dość łatwe do kwerendy danych z innych usług lub działalności, wywołując getContentResolver().

ContentResolver cR = getContentResolver(); 
Cursor fixes = cR.query(CONTENT_URI, ...); 

Ale nie jestem w stanie zadzwonić do mojej metody niestandardowej (FixesContentProvider#getLastFix). Jak mogę wywołać metody niestandardowe zdefiniowane w dostawcy treści?

Może nie rozumiem, jak działają ContentProviders/ContentResolvers w tym przypadku, ale oficjalne Android documentation provided by Google nie jest bardzo jasne w tym sensie.

Odpowiedz

13

Ale nie jestem w stanie nazwać moją metodę niestandardową (FixesContentProvider#getLastFix).

To całkowicie prawda. Jednak w tym przypadku można skorzystać z jednego faktu: obie metody zwracają obiekt Cursor. Więc to, co robię, byłoby dodanie pewnej wartości do identyfikatora URI, który przekazuje się do query, a następnie decyduje, co faktycznie chcesz zrobić: query lub getLastFix. Na przykład:

public Cursor query(Uri uri,...) { 
    if (uri says it has to return the last fix) 
     return getLastFix(uri); 
    // otherwise, do normal operations... 
    return cursor; 
} 

W rzeczywistości metoda query jest przypuszczać, aby zwrócić wynik, zważywszy na Uri. Tak więc, jeśli potrzebujesz pobrać ostatnią poprawkę, musisz podać w identyfikatorze URI, która ma być ostatnią poprawką.

+0

Tak właśnie zrobiłem. Użyłem UriMatcher.addUri, aby dopasować "content: // xxx/fixes" i "content: // xxx/fixes/last" do dwóch różnych kodów, działając odpowiednio (jak sugerujesz) w przełączniku (myUriMatcher.match (uri)) {case CODE_1: xxx; case KOD_2: rrr; }. Dziękuję Ci bardzo. –

Powiązane problemy