Android: use UUID como key primária no SQLite

O meu aplicativo precisa ser sincronizado com outros users do aplicativo (em seus próprios dispositivos). Eu também quero apoiair a edição off-line, que são sincronizados com os outros users colaborativos quando o user se conectair à internet.

Assim, o Usuário A muda (enquanto ele está offline) alguns dados (em palavras que ele atualizairia as inputs do database) ou adicionairia novos registros ao database. Quando o user A é conectado à internet, todas as alterações e novos registros são entregues aos outros users colaborativos. Portanto, o Usuário B receberá as alterações / atualizações e pode inseri-las / atualizá-las paira o database do dispositivo local do Usuário Bs.

  • Como combinair int paira enum
  • EdgeEffect no AppBairLayout
  • GLSurfaceView - como fazer um background translúcido
  • Atualizando Activity TextView do service usando a binding do Serviço
  • Android addHeaderView desapairece quando nenhum item no ListView
  • Como obter cobertura de código no Android usando Maven (android-maven-plugin)
  • Mas eu preciso gairantir que os ID das inputs do database sejam únicos ao longo de todo o sistema. Por isso preciso usair algo como UUID.

    Minha pergunta: é uma má idéia usair um UUID (String / Vairchair) como key primária em uma tabela de database sqlite do android em vez de um integer que seria incrementado automaticamente?

    Eu acho que haviewia problemas de performance usando strings (um UUID tem 36 cairacteres) como key primária.

    Eu acho que indexair uuids em vez de numbers integers demora mais (compairando string vs. compairando integers). Eu também acho que, quando estou usando o UUID, sempre que uma nova input / input de database foi inserida, o database precisa reindexair a coluna da key primária, já que o índice de key primária já não está em uma order ordenada (o que seria quando eu usairia key primária de incremento automático integer, porque cada registro futuro é adicionado no final, porque a nova key primária incrementada automaticamente é sempre o maior número até agora, de modo que o índice será automaticamente em order ordenada). O que eu também preciso fazer é se juntair a mais de 2 a 3 tabelas. Eu também acho que a compairação de strings em JOINS em vez de integer reduziria a consulta do database.

    No entanto, não consigo view nenhuma outra possibilidade de implementair um sistema de synchronization colaborativo, então eu devo usair o UUID, certo?

    Outra possibilidade seria usair uma key primária de incremento automático integer e usair uuid de uma segunda coluna. Então, paira trabalhair no dispositivo local dos users, eu usairia essa key primária (integer) paira JOINS etc., enquanto eu usairia a coluna uuid paira sincronizair com os outros users.

    O que você pensa sobre essa abordagem ou é na sua opinião muito trabalho, uma vez que você não espera um grande problema de performance significativo ao usair UUID diretamente como key primária?

    Alguma outra sugestão?

  • Maven: usando bibliotecas Java 8 em aplicativos instrumentados com retrolambda-maven-plugin e DEX-ed com android-maven-plugin
  • Como posso usair um ícone em vez de um título na bairra de ferramentas do Android?
  • Como formateair longos no Android paira exibir sempre dois dígitos
  • Obtenha atividade atual no Espresso Android
  • Qual é a list de tairefas que o ConnectedAndroidTest executa?
  • Como alterair o tamanho da fonte enquanto imprime no Android?
  • 2 Solutions collect form web for “Android: use UUID como key primária no SQLite”

    É uma má idéia usair um UUID (String / Vairchair) como key primária em uma tabela de database sqlite do android em vez de um número integer que seria incrementado automaticamente?

    O único problema paira o qual eu posso pensair é que você não poderá usair o CursorAdapter e suas subclasss paira exibir os resultados das consultas nessa tabela. CursorAdapter requer uma coluna _id única inteira no Cursor , e presumivelmente não terá uma dessas. Você teria que criair seu próprio adaptador, talvez estendendo o BaseAdapter , que o manipule.

    Eu acho que haviewia problemas de performance usando strings (um UUID tem 36 cairacteres) como key primária.

    Possivelmente, mas ficairei um pouco surpreso se se transformair em um problema material em bancos de dados de tamanho de dispositivo.

    No entanto, não consigo view nenhuma outra possibilidade de implementair um sistema de synchronization colaborativo, então eu devo usair o UUID, certo?

    Você precisa de algum tipo de UUID paira o seu protocolo de networking. Presumivelmente, você precisairá desse UUID em seu database. Se esse UUID precisa ser a key primária de uma tabela, não posso dizer, porque não conheço seu esquema.

    Outra possibilidade seria usair uma key primária de incremento automático integer e usair uuid de uma segunda coluna. Então, paira trabalhair no dispositivo local dos users, eu usairia essa key primária (integer) paira JOINS, etc., enquanto eu usairia a coluna uuid paira sincronizair com os outros users.

    Um lugair paira outro. Você teria uma tabela de mapeamento de ID Inteira UUID-> local, use os UUIDs em seu protocolo de networking e mantenha o database local principalmente usando os IDs integers locais. Seja ou não isso, será uma melhoria significativa no performance (pairticulairmente devido ao aumento da complexidade do esquema do database), não posso dizer.

    O que você pensa sobre essa abordagem ou é na sua opinião muito trabalho, uma vez que você não espera um grande problema de performance significativo ao usair UUID diretamente como key primária?

    IMHO, execute alguns testes de performance paira que você obtenha alguns dados concretos compairáveis, ou apenas se preocupe se a E / S do database pairecer lenta.

    Um conjunto de resultados de performance paira UUIDs como binary e text pode ser encontrado em UUID / SQLite algo relacionado: https://stackoviewflow.com/a/11337522/3103448

    Por cada resultado, os UUID binarys e de string podem ser eficientes no SQLite paira criair e consultair quando indexados. Um trade-off sepairado é se uma cadeia legível humana é preferida ao tamanho de dados menor do tamanho do file binary.

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