Es ist wahrscheinlich ein bisschen spät für Sie, aber andere mögen dies nützlich finden.
Zuerst müssen Sie mehrere CONTENT_URIs erstellen
public static final Uri CONTENT_URI1 =
Uri.parse("content://"+ PROVIDER_NAME + "/sampleuri1");
public static final Uri CONTENT_URI2 =
Uri.parse("content://"+ PROVIDER_NAME + "/sampleuri2");
Dann erweitern Sie Ihren URI Matcher
private static final UriMatcher uriMatcher;
static {
uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
uriMatcher.addURI(PROVIDER_NAME, "sampleuri1", SAMPLE1);
uriMatcher.addURI(PROVIDER_NAME, "sampleuri1/#", SAMPLE1_ID);
uriMatcher.addURI(PROVIDER_NAME, "sampleuri2", SAMPLE2);
uriMatcher.addURI(PROVIDER_NAME, "sampleuri2/#", SAMPLE2_ID);
}
Dann erstellen Sie Ihre Tabellen
private static final String DATABASE_NAME = "sample.db";
private static final String DATABASE_TABLE1 = "sample1";
private static final String DATABASE_TABLE2 = "sample2";
private static final int DATABASE_VERSION = 1;
private static final String DATABASE_CREATE1 =
"CREATE TABLE IF NOT EXISTS " + DATABASE_TABLE1 +
" (" + _ID1 + " INTEGER PRIMARY KEY AUTOINCREMENT," +
"data text, stuff text);";
private static final String DATABASE_CREATE2 =
"CREATE TABLE IF NOT EXISTS " + DATABASE_TABLE2 +
" (" + _ID2 + " INTEGER PRIMARY KEY AUTOINCREMENT," +
"data text, stuff text);";
Vergessen Sie nicht , den zweiten hinzufügen DATABASE_CREATE
zuonCreate()
Sie werden einen Switch-Case- Block verwenden, um zu bestimmen, welche Tabelle verwendet wird. Dies ist mein Einfügecode
@Override
public Uri insert(Uri uri, ContentValues values) {
Uri _uri = null;
switch (uriMatcher.match(uri)){
case SAMPLE1:
long _ID1 = db.insert(DATABASE_TABLE1, "", values);
//---if added successfully---
if (_ID1 > 0) {
_uri = ContentUris.withAppendedId(CONTENT_URI1, _ID1);
getContext().getContentResolver().notifyChange(_uri, null);
}
break;
case SAMPLE2:
long _ID2 = db.insert(DATABASE_TABLE2, "", values);
//---if added successfully---
if (_ID2 > 0) {
_uri = ContentUris.withAppendedId(CONTENT_URI2, _ID2);
getContext().getContentResolver().notifyChange(_uri, null);
}
break;
default: throw new SQLException("Failed to insert row into " + uri);
}
return _uri;
}
Sie müssen die devide up delete
, update
, getType
etc. Überall dort , wo Ihr Provider fordert DATABASE_TABLE oder CONTENT_URI Sie einen Fall hinzufügen und haben DATABASE_TABLE1 oder CONTENT_URI1 in ein und # 2 in der nächsten und so weiter für so viele , wie Sie wollen.
query
,queryUsers
,queryUser
,queryGroups
,queryGroup
Das ist , wie die integrierten Kontakte Anbieter tun es. com.android.providers.contacts.ContactsProvider2.java github.com/android/platform_packages_providers_contactsprovider/…Ich empfehle, den Quellcode für den Android 2.x ContactProvider zu überprüfen. (Was online zu finden ist). Sie verarbeiten tabellenübergreifende Abfragen, indem sie spezielle Ansichten bereitstellen, für die Sie dann Abfragen im Back-End ausführen. Am Frontend sind sie für den Anrufer über verschiedene URIs über einen einzigen Inhaltsanbieter zugänglich. Möglicherweise möchten Sie auch eine oder zwei Klassen zum Halten von Konstanten für Ihre Tabellenfeldnamen und URI-Zeichenfolgen bereitstellen. Diese Klassen können entweder als API-Include oder als Drop-In-Klasse bereitgestellt werden und erleichtern der konsumierenden Anwendung die Verwendung erheblich.
Es ist ein bisschen komplex, deshalb möchten Sie vielleicht auch den Kalender überprüfen, um eine Vorstellung davon zu bekommen, was Sie tun und was nicht.
Sie sollten nur einen einzigen DB-Adapter und einen einzigen Inhaltsanbieter pro Datenbank (nicht pro Tabelle) benötigen, um den größten Teil der Arbeit zu erledigen. Sie können jedoch mehrere Adapter / Anbieter verwenden, wenn Sie dies wirklich möchten. Das macht die Sache nur etwas komplizierter.
quelle
switch
Lösung verwendet, aber dieser Teil, den Sie erwähnt haben :They handle cross table queries by providing specialized views that you then run queries against on the back end. On the front end they are accessible to the caller via various different URIs through a single content provider
. Glaubst du, du könntest das etwas ausführlicher erklären?Man
ContentProvider
kann mehrere Tabellen bedienen, aber sie sollten etwas verwandt sein. Es macht einen Unterschied, ob Sie Ihre Anbieter synchronisieren möchten. Wenn Sie separate Synchronisierungen für beispielsweise Kontakte, E-Mail oder Kalender wünschen, benötigen Sie für jeden von ihnen unterschiedliche Anbieter, auch wenn sie sich in derselben Datenbank befinden oder mit demselben Dienst synchronisiert werden, da Synchronisierungsadapter direkt mit ihnen verknüpft sind ein bestimmter Anbieter.Soweit ich das beurteilen kann, können Sie jedoch nur einen einzigen SQLiteOpenHelper pro Datenbank verwenden, da er seine Metainformationen in einer Tabelle in der Datenbank speichert. Wenn Sie also
ContentProviders
auf dieselbe Datenbank zugreifen, müssen Sie den Helper irgendwie freigeben.quelle
Hinweis: Dies ist eine Klarstellung / Änderung der Antwort von Opy.
Dieser Ansatz unterteilt jede der
insert
,delete
,update
undgetType
Methoden mit switch - Anweisungen , um jede Ihrer einzelnen Tabellen zu behandeln. Sie verwenden einen CASE, um jede Tabelle (oder URL) zu identifizieren, auf die verwiesen werden soll. Jeder CASE wird dann einer Ihrer Tabellen oder URIs zugeordnet. Beispielsweise wird TABELLE1 oder URI1 in FALL 1 usw. für alle Tabellen ausgewählt, die Ihre App verwendet.Hier ist ein Beispiel für den Ansatz. Dies ist für die Einfügemethode. Es ist etwas anders implementiert als Opy's, hat aber die gleiche Funktion. Sie können den gewünschten Stil auswählen. Ich wollte auch sicherstellen, dass insert einen Wert zurückgibt, auch wenn das Einfügen der Tabelle fehlschlägt. In diesem Fall wird a zurückgegeben
-1
.quelle
Ich habe die beste Demo und Erklärung für ContentProvider gefunden und denke, dass sie den Android-Standards entspricht.
Vertragsklassen
und innere Klassen:
Erstellen Sie nun eine Datenbank mit SQLiteOpenHelper :
Inhalt Anbieter:
Ich hoffe es wird dir helfen.
Demo auf GitHub: https://github.com/androidessence/MovieDatabase
Vollständiger Artikel: https://guides.codepath.com/android/creating-content-providers
Verweise:
http://code.tutsplus.com/tutorials/android-sdk_content-providers--mobile-5549
http://www.grokkingandroid.com/android-tutorial-writing-your-own-content-provider/
http://developer.android.com/guide/topics/providers/content-providers.html
https://thenewcircle.com/s/post/1375/android_content_provider_tutorial
http://www.grokkingandroid.com/android-tutorial-content-provider-basics/
http://androidessence.com/
Hinweis: Ich habe Code kopiert, nur weil der Link der Demo oder des Artikels in Zukunft möglicherweise entfernt wird.
quelle