Wynalazkowo - eksperymenty małe i duże

Udacity

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;
}