Udacity – czego nauczyłam się z kursu cz. 5

  1. Tworzenie ContentProvider

A)      Tworzymy klasę dziedziczącą po ContentProvider

public class TaskContentProvider extends ContentProvider {

B)      Z zaimplementowanymi metodami:

@Override
public boolean onCreate() {}

@Override
public Uri insert(@NonNull Uri uri, ContentValues values) {
}

@Override
public Cursor query(@NonNull Uri uri, String[] projection, String selection,
}

@Override
public int delete(@NonNull Uri uri, String selection, String[] selectionArgs) {

}

@Override
public int update(@NonNull Uri uri, ContentValues values, String selection,
String[] selectionArgs) {
}

@Override
public String getType(@NonNull Uri uri) {
}

c) rejestrujemy ContentProvider w pliku manifest.xml:

<provider
    android:name="com.example.android.todolist.data.TaskContentProvider"  -> nazwa klasy, która dostarcza ContentProvider
    android:authorities="com.example.android.todolist" ->nazwa pakietu w jakim się on znajduje
    android:exported="false"></provider> -> czy ten ContentProvider ma być dostępny z innych aplikacji w telefonie

 

2. URI od ContentProvider

a)       Ma taką postać:

 

<scheme>//<authority>/<path>

Czyli, np.

Content://nazwa_pakietu_w_ktorym_jest_ContentProvider/rodzaj_danych

 

b)      Przykładowe URI:

Content://com.android.example.todolist/tasks

 

c)       Warto tworząc URI – dawać dostęp do różnych rodzajów danych (np. wszystkie rekordy, pojedynczy rekord)

 

d) Można stosować wyrażenia regularne w URI

-dozwolone:

# – dowolny integer

*- dowolny String

e) do dobierania się do poszczególnych rekordów polecam URImatcher

 

public class TaskContentProvider extends ContentProvider {     public static final int TASKS=100;     public static final int TASK_WITH_ID=101;

 

private static final UriMatcher sUriMatcher=buildUriMatcher();

    //method that associates URI’s with their int match     public static UriMatcher buildUriMatcher()     {         UriMatcher uriMatcher=new UriMatcher(UriMatcher.NO_MATCH);         uriMatcher.addURI(TaskContract.AUTHORITY,TaskContract.PATH_TASKS,TASKS);         uriMatcher.addURI(TaskContract.AUTHORITY,TaskContract.PATH_TASKS+„/#”,TASK_WITH_ID);

 

return uriMatcher;

    }

 

   Później używamy go tak:
Int match=sUriMatcher.match(uri);

 

3) przykładowa implementecja insert

 

@Override

public Uri insert(@NonNull Uri uri, ContentValues values) {

    final SQLiteDatabase db=mTaskDbHelper.getWritableDatabase();



    int match=sUriMatcher.match(uri);

    Uri retUri=null;


    if (match==TASK_WITH_ID)

    {


        long id=db.insert(TaskContract.TaskEntry.TABLE_NAME,null,values);

        if (id>0)

        {

            retUri= ContentUris.withAppendedId(TaskContract.TaskEntry.CONTENT_URI,id) ;


        }

        else
        {

            throw new android.database.SQLException("Failed to insert row into "+ uri);

        }

    }

    else
    {

        if (match!=TASKS)

        {

            throw new UnsupportedOperationException("Unknown uri: "+uri);

        }

    }

        getContext().getContentResolver().notifyChange(uri,null);

    return retUri;

}

 

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *