Probablemente sea un poco tarde para ti, pero otros pueden encontrar esto útil.
Primero debes crear varios CONTENT_URI
public static final Uri CONTENT_URI1 =
Uri.parse("content://"+ PROVIDER_NAME + "/sampleuri1");
public static final Uri CONTENT_URI2 =
Uri.parse("content://"+ PROVIDER_NAME + "/sampleuri2");
Luego expande su 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);
}
Entonces crea tus tablas
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);";
No olvide agregar el segundo DATABASE_CREATE
aonCreate()
Va a utilizar un bloque de caso de interruptor para determinar qué tabla se utiliza. Este es mi código de inserción
@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;
}
Tendrá que dividiremos el delete
, update
, getType
, etc. Dondequiera que sus llamadas del proveedor de DATABASE_TABLE o CONTENT_URI va a agregar un caso y tienen DATABASE_TABLE1 o CONTENT_URI1 en uno y # 2 en el siguiente y así sucesivamente para todas las que quieran.
query
,queryUsers
,queryUser
,queryGroups
,queryGroup
Así es como el proveedor de contactos incorporados hace. com.android.providers.contacts.ContactsProvider2.java github.com/android/platform_packages_providers_contactsprovider/…Recomiendo consultar el código fuente de ContactProvider de Android 2.x. (Que se puede encontrar en línea). Manejan consultas de tabla cruzada al proporcionar vistas especializadas que luego ejecuta consultas en el back-end. En la interfaz, la persona que llama puede acceder a ellos a través de varios URI diferentes a través de un único proveedor de contenido. Probablemente también querrá proporcionar una clase o dos para mantener constantes para los nombres de campo de su tabla y cadenas de URI. Estas clases se pueden proporcionar como una API incluida o como una caída en la clase, y harán que sea mucho más fácil de usar para la aplicación consumidora.
Es un poco complejo, por lo que es posible que también desee ver cómo funciona el calendario para tener una idea de lo que necesita y lo que no necesita.
Solo debería necesitar un único adaptador de base de datos y un único proveedor de contenido por base de datos (no por tabla) para realizar la mayor parte del trabajo, pero puede utilizar varios adaptadores / proveedores si realmente lo desea. Simplemente complica un poco las cosas.
fuente
switch
solución, pero esta parte que mencioné: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
. ¿Crees que podrías explicarlo un poco más en detalle?Uno
ContentProvider
pueden servir varias mesas, pero deberían estar algo relacionadas. Marcará la diferencia si tiene la intención de sincronizar sus proveedores. Si desea sincronizaciones separadas para, digamos, Contactos, Correo o Calendario, necesitará diferentes proveedores para cada uno de ellos, incluso si terminan en la misma base de datos o están sincronizados con el mismo servicio, porque los Adaptadores de sincronización están vinculados directamente a un proveedor en particular.Sin embargo, por lo que puedo decir, solo puede usar un único SQLiteOpenHelper por base de datos, ya que almacena su metainformación en una tabla dentro de la base de datos. Entonces, si
ContentProviders
accede a la misma base de datos, tendrá que compartir el Asistente de alguna manera.fuente
Nota: Esta es una aclaración / modificación a la respuesta proporcionada por Opy.
Este enfoque se subdivide cada uno de los
insert
,delete
,update
, ygetType
métodos con las instrucciones switch para manejar cada una de las tablas individuales. Utilizará CASE para identificar cada tabla (o uri) a la que se hará referencia. Luego, cada CASO se asigna a una de sus tablas o URI. Por ejemplo, TABLE1 o URI1 se selecciona en CASO # 1, etc. para todas las tablas que emplea su aplicación.Aquí tienes un ejemplo del enfoque. Esto es para el método de inserción. Está implementado de manera un poco diferente a la de Opy, pero realiza la misma función. Puede seleccionar el estilo que prefiera. También quería estar seguro de que insertar devuelve un valor incluso si falla la inserción de la tabla. En ese caso, devuelve un
-1
.fuente
Encontré la mejor demostración y explicación para ContentProvider y creo que ha seguido los estándares de Android.
Clases de contrato
y clases internas:
Ahora creando una base de datos usando SQLiteOpenHelper :
Proveedor de contenido:
Espero que te ayude.
Demo en GitHub: https://github.com/androidessence/MovieDatabase
Articulo completo : https://guides.codepath.com/android/creating-content-providers
Referencias:
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/
Nota: Copié el código solo porque si el enlace de la demostración o el artículo puede eliminarse en el futuro.
fuente