Provavelmente é um pouco tarde para você, mas outros podem achar isso útil.
Primeiro você precisa criar vários CONTENT_URIs
public static final Uri CONTENT_URI1 =
Uri.parse("content://"+ PROVIDER_NAME + "/sampleuri1");
public static final Uri CONTENT_URI2 =
Uri.parse("content://"+ PROVIDER_NAME + "/sampleuri2");
Então você expande seu 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);
}
Em seguida, crie suas tabelas
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);";
Não se esqueça de adicionar o segundo DATABASE_CREATE
aonCreate()
Você usará um bloco de caixa de chave para determinar qual tabela é usada. Este é o meu código de inserção
@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;
}
Você terá que dividir o delete
, update
, getType
, etc. Onde quer que suas chamadas de provedor para DATABASE_TABLE ou CONTENT_URI você irá adicionar um caso e têm DATABASE_TABLE1 ou CONTENT_URI1 em um e # 2 na próxima e assim por diante para tantos como você quer.
query
,queryUsers
,queryUser
,queryGroups
,queryGroup
Isto é como o provedor de built-in contatos faz. com.android.providers.contacts.ContactsProvider2.java github.com/android/platform_packages_providers_contactsprovider/…Recomendo verificar o código-fonte do ContactProvider do Android 2.x. (Que pode ser encontrado online). Eles lidam com consultas de tabela cruzada, fornecendo visualizações especializadas nas quais você executa consultas no back end. No front-end, eles são acessíveis ao chamador por meio de vários URIs diferentes por meio de um único provedor de conteúdo. Provavelmente, você também desejará fornecer uma ou duas classes para manter constantes para os nomes dos campos da tabela e strings de URI. Essas classes podem ser fornecidas como uma inclusão de API ou como uma queda na classe e tornarão muito mais fácil para o aplicativo de consumo usar.
É um pouco complexo, então você também pode querer verificar como funciona o calendário para ter uma ideia do que você faz e do que não precisa.
Você deve precisar apenas de um único adaptador de banco de dados e um único provedor de conteúdo por banco de dados (não por tabela) para fazer a maior parte do trabalho, mas você pode usar vários adaptadores / provedores se realmente quiser. Isso só torna as coisas um pouco mais complicadas.
fonte
switch
solução, mas esta parte que você mencionou: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
. Você acha que poderia explicar isso um pouco mais detalhadamente?Um
ContentProvider
pode servir várias tabelas, mas eles devem ser algo relacionado. Vai fazer diferença se você pretende sincronizar seus provedores. Se você quiser sincronizações separadas para, digamos, Contatos, Correio ou Calendário, você precisará de provedores diferentes para cada um deles, mesmo que eles acabem no mesmo banco de dados ou sejam sincronizados com o mesmo serviço, porque os Adaptadores de Sincronização estão ligados diretamente a um provedor específico.Até onde eu posso dizer, você só pode usar um único SQLiteOpenHelper por banco de dados, já que ele armazena suas metainformações em uma tabela dentro do banco de dados. Portanto, se você
ContentProviders
acessar o mesmo banco de dados, precisará compartilhar o Helper de algum modo.fonte
Observação: este é um esclarecimento / modificação à resposta fornecida pela Opy.
Esta abordagem subdivide cada um dos
insert
,delete
,update
, egetType
métodos com declarações switch para lidar com cada uma de suas tabelas individuais. Você usará um CASE para identificar cada tabela (ou uri) a ser referenciada. Cada CASE então mapeia para uma de suas tabelas ou URIs. Por exemplo, TABLE1 ou URI1 é selecionado no CASO # 1, etc. para todas as tabelas que seu aplicativo utiliza.Aqui está um exemplo da abordagem. Isso é para o método de inserção. É implementado um pouco diferente do Opy, mas executa a mesma função. Você pode selecionar o estilo de sua preferência. Eu também queria ter certeza de que insert retornaria um valor mesmo se a inserção da tabela falhar. Nesse caso, ele retorna um
-1
.fonte
Encontrei a melhor demonstração e explicação para ContentProvider e acho que segue os padrões do Android.
Classes de contrato
e classes internas:
Agora criando banco de dados usando SQLiteOpenHelper :
Provedor de conteúdos:
Espero que ajude você.
Demonstração no GitHub: https://github.com/androidessence/MovieDatabase
Artigo completo: https://guides.codepath.com/android/creating-content-providers
Referências:
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: Copiei o código apenas porque se o link da demonstração ou artigo puder ser removido no futuro.
fonte