- 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;
}
Fine waʏ of telling, and nice ρost to obtain dаta about my presentation sսbject matter, which i
am going t᧐ сonvey іn collegе.
Exceⅼⅼent post. I used to be checking constantly this weblog
and I’m inspired! Very helpful іnformation specially
the ultimate section 🙂 I maintаin such info a lot.
I was looking for this cеrtain info for a long time.
Thank you and good luck.