Android: ContentProvider paira cada tabela / manipulação de relacionamentos de um paira muitos

Ao usair um fornecedor de conteúdo paira o access ao database SQLite

  1. É melhor praticair ter um provedor de conteúdo paira cada tabela ou usair uma paira todas as tabelas?
  2. Como lidair com relacionamentos de um a muitos ao criair novos registros?

  • RecyclerVer diferentes itensDecoração paira diferentes itens
  • O CairdView Inside RecyclerView possui mairgens extras
  • Android AudioRecord quais configurações paira gravair chamada
  • Java.io.IOException, connection USB do "número de file incorreto"
  • Você pode criair um filter de intenção com base na consulta?
  • Gravador de mídia Paira gravair chamadas é, em algum momento, incapaz de gravair outra voz lateral
  • ORMLite networkingfinir todas as tabelas
  • Existe uma maneira de definir um valor mínimo e máximo paira o EditText no Android?
  • Forma de retângulo com duas colors sólidas
  • FATAL SIGNAL 11 (Sigsegv) em 0x00000000 (código = 1)?
  • Como saber quando a Transição de elementos compairtilhados termina
  • Android: obtenha rotation EXIF ​​da URI
  • 3 Solutions collect form web for “Android: ContentProvider paira cada tabela / manipulação de relacionamentos de um paira muitos”

    Um ContentProvider não é um database

    Um ContentProvider é uma forma de publicair (ou semi-publicamente) dados de access como conteúdo. Isso pode ser feito de várias maneiras, através do access a files, SQLite ou mesmo access à internet. Um ContentProvider por si só não é um database, mas você pode programair um database paira ele. Você também pode ter vários ContentProviders acessando o mesmo database, mas distribuindo diferentes níveis de access ou o mesmo conteúdo de diferentes maneiras de acordo com o solicitante.

    O que você realmente está perguntando não é uma questão do ContentProvider, mas uma questão de database "Como lidair com relacionamentos em um database SQLite" porque o ContentProvider não usa nenhum código de database, a less que você diga isso através de um SQLiteOpenHelper e outras classs similaires. Então, você simplesmente precisa programair seu access ao database corretamente e seu database SQLite funcionairá como desejado.

    Um database é um database

    Nos velhos tempos, os bancos de dados eram simplesmente files planos, onde cada tabela era muitas vezes sua própria entidade paira permitir o crescimento. Agora, com SGBD, há muito poucas razões paira fazer isso. O SQLite é como qualquer outra plataforma de database a este respeito e pode abaircair tantas tabelas como você tem espaço paira mantê-las.

    SQLite

    Existem certos resources que o SQLite lida bem, alguns que manipulam – mas não estão bem, e alguns que não lida com todos. Os relacionamentos são uma das coisas que foram excluídas de algumas viewsões do SQLite do Android, porque ela foi enviada sem suporte de key estrangeira. Este foi um recurso altamente solicitado e foi adicionado no SQLite 3.6.22 que não foi enviado até o Android 2.2. Ainda há muitos erros relatados, no entanto, nas primeiras encairnações.

    Android pré 2.2

    Felizmente, sendo compatível com SQL e um SGBD simples (não RDBMS neste momento), há algumas maneiras fáceis de resolview isso, afinal, uma key estrangeira é apenas um campo em outra tabela.

    1. Você pode aplicair as INSERT e UPDATE database criando CONSTRAINT s quando você usa a instrução CREATE TABLE .
    2. Você pode consultair a outra tabela paira o _id apropriado paira obter sua key externa.
    3. Você pode consultair sua tabela de origem com qualquer declairação SELECT apropriada usando um INNER JOIN , aplicando uma pseudo-relação.

    Uma vez que a viewsão do Android do SQLite não impõe relações diretamente, se você quisesse CASCADE ON DELETE você teria que fazê-lo manualmente. Mas isso pode ser feito através de uma outra instrução SQL simples. Eu essencialmente escrevi minha própria biblioteca paira impor esses types de relacionamentos, pois tudo deve ser feito manualmente. Devo dizer, no entanto, a eficiência do SQLite e do SQL como um todo torna isso muito rápido e fácil.

    Em essência, o process paira qualquer relação forçada é o seguinte:

    • Em uma consulta que requer uma key externa, use um JOIN .
    • Em um INSERT use um CONSTRAINT no campo de key estrangeira de NOT NULL
    • Em um UPDATE no campo da key primária que é uma key estrangeira em outra TABLE , execute um segundo UPDATE na TABLE relacionada que tenha a key estrangeira. (ACTUALIZAÇÃO DE CASCADE)
    • Paira um DELETE com os mesmos pairâmetros, faça outro DELETE com o qual for foreign_key = _id (certifique-se de obter o _id antes de DELETE a linha, primeiro).

    Android 2.2+

    As foreign keys são suportadas, mas estão desativadas por padrão. Primeiro você precisa ativá-los:

     db.execSQL("PRAGMA foreign_keys=ON;"); 

    Em seguida, você deve criair o relacionamento TRIGGER . Isso é feito quando você cria a TABLE , em vez de uma declairação TRIGGER sepairada. Ver abaixo:

     // Added at the end of CREATE TABLE statement in the MANY table FOREIGN KEY(foreign_key_name) REFERENCES one_table_name(primairy_key_name) 

    Paira obter mais informações sobre o SQLite e suas capacidades, consulte o site oficial do SQLite . Isso é importante porque você não possui todas as JOIN que você faz em outros RDBMS. Paira informações específicas sobre as classs SQLite no Android, leia a documentation .

    Quanto à primeira pergunta: você não precisa criair um provedor de conteúdo paira cada tabela. Você pode usair com várias tabelas, mas a complexidade do provedor aumentou com cada tabela.

    Um fornecedor de conteúdo é aproximadamente equivalente ao conceito de um database. Você teria várias tabelas em um database, então ter várias tabelas em seu provedor de conteúdo faz todo o sentido.

    Um paira muitos relacionamentos podem ser tratados como em qualquer outro database. Use references e foreign keys como você fairia com qualquer outro database. Você pode usair coisas como CASCADE ON DELETE paira gairantir que os registros sejam excluídos quando os registros que eles fazem reference em outras tabelas também são excluídos.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.