Sobes.tech
Middle

Czym jest Content Provider i jak jest używany w Androidzie?

sobes.tech AI

Odpowiedź od AI

Content Provider — jest jednym z podstawowych elementów Androida (komponent Application Component), który zapewnia zunifikowany interfejs do dostępu i zarządzania danymi strukturalnymi. Działa jako pośrednik między aplikacją a źródłem danych (np. baza danych SQLite, pliki, dane sieciowe).

Używa się go do:

  • Wspólnego dostępu do danych: Umożliwia różnym aplikacjom bezpieczny dostęp do tych samych danych bez bezpośredniego dostępu do źródła danych.
  • Zarządzania uprawnieniami: Pozwala kontrolować, które aplikacje mają dostęp do danych i jakie operacje (odczyt, zapis, aktualizacja, usuwanie) mogą wykonywać.
  • Abstrakcji źródła danych: Ukrywa szczegóły implementacji źródła danych przed klientami, upraszczając dostęp do danych.
  • Integracji z frameworkiem Android: Używany przez komponenty takie jak CursorLoader do asynchronicznego ładowania danych w UI oraz SyncAdapter do synchronizacji danych.

Główne metody Content Provider:

// Wykonuje zapytanie do providera i zwraca Cursor
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder);

// Wstawia nowy wpis do providera i zwraca URI nowego wpisu
public Uri insert(Uri uri, ContentValues values);

// Aktualizuje istniejące wpisy w providerze i zwraca liczbę zaktualizowanych wierszy
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs);

// Usuwa wpisy z providera i zwraca liczbę usuniętych wierszy
public int delete(Uri uri, String selection, String[] selectionArgs);

// Zwraca typ MIME danych dla danego URI
public String getType(Uri uri);

// Inicjuje providera podczas jego tworzenia
public boolean onCreate();

Format URI do dostępu do Content Provider:

content://authority/path segment/id

gdzie:

  • content:// — standardowy schemat dla Content Providers.
  • authority — unikalny ciąg identyfikujący Content Provider (zwykle nazwa pakietu aplikacji lub jej część).
  • path segment — opcjonalna część wskazująca na konkretną tabelę lub zestaw danych.
  • id — opcjonalna część wskazująca na konkretny rekord w zestawie danych.

Przykład użycia ContentResolver do interakcji z Content Provider:

// Uzyskanie instancji ContentResolver
ContentResolver resolver = getContentResolver();

// URI do dostępu do danych (np. systemowy provider kontaktów)
Uri contactsUri = ContactsContract.Contacts.CONTENT_URI;

// Wykonanie zapytania
Cursor cursor = resolver.query(contactsUri, null, null, null, null);

// Przetwarzanie wyniku (przechodzenie po cursorze)
if (cursor != null && cursor.moveToFirst()) {
    // ... odczyt danych z cursor
    cursor.close(); // Zawsze zamykaj cursor!
}

Rejestracja Content Provider w AndroidManifest.xml:

<provider
    android:name=".MyContentProvider"
    android:authorities="com.example.myapp.provider"
    android:exported="true"
    android:readPermission="com.example.myapp.permission.READ_DATA"
    android:writePermission="com.example.myapp.permission.WRITE_DATA" />