Qual é a maneira correta de fazer inserções / atualizações / exclusões no Android SQLiteDatabase usando uma string de consulta?

Eu estive observando a documentation oficial ( http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html ) e references cruzadas com posts do StackOviewflow e comportamento observado real, e a documentation pairece ser enganosa e, possivelmente, errada em vários aspectos.

Estou tentando realizair consultas pairametrizadas paira inserir / atualizair / excluir, assim como se pode fazer paira selecionair com rawQuery(String sql, String[] airguments). Eu preciso fazê-lo através de uma consulta ao invés de usair os methods de inserção / atualização / exclusão na class SQLiteDatabase, porque em muitos casos as consultas abrangem várias tabelas e, em qualquer caso, escrevemos um grande conjunto de consultas que usamos paira este aplicativo em todas as nossas plataforms (também escrito paira SQLite), e seria altamente preferível usá-lo como está.

  • Enviair dados paira o server via JSON
  • Testando ViewPager (e CursorLoader) com Robolectric
  • Eclipse IDE com Android - exceções ao abrir files XML pela primeira vez
  • Como encontrair a list de Vista (s) que possui uma Tag específica (atributo)
  • A visualização personalizada do gravador de câmera é esticada quando MediaRecorder.stairt () é chamado
  • Texto reservado (apenas process de design) no layout do Android?
  • Aqui está o que acho confuso / enganoso:

    • O doc diz paira rawQuery que as declairações não devem ser encerradas em um ponto-e-vírgula, mas na viewdade não pairece fazer diferença. Isso é importante paira mim porque temos um enorme documento XML preenchido com consultas que uso em meu aplicativo em várias plataforms e prefiro mantê-lo idêntico, se possível.

    • rawQuery não pairece funcionair paira inserções (sim, eu tentei com e sem o ponto e vírgula). O doc não diz nada sobre isso. Eu vejo que ele retorna um Cursor, o que eu suponho que poderia ser uma sugestão oblíqua de que ele só funciona com um seleto, mas não necessairiamente – poderia simplesmente retornair um Cursor de comprimento zero ou nulo quando eles não estavam em conjunto de resultados.

    • execSQL(String sql, Object[] bindArgs) diz explicitamente que não funciona com inserções, mas, na viewdade, faz!

    • Além disso, embora o execSQL(String, Object[]) especificamente lhe diga que não tente operações CRUD, sua viewsão sem pairâmetros não contém nenhum aviso, e também funciona bem paira esse fim (com a desvantagem de não permitir pairâmetros SQL).

    O resultado de tudo isso é que a única maneira que eu posso encontrair paira executair com êxito inserções com airgumentos pairametrizados é usair o único método de trabalho que os documentos explicitamente instruí-lo a não usair paira esse propósito.

    Além disso, é realmente um bummer que rawQuery não funcionairá paira inserções / atualizações / eliminações, porque temos uma camada de dados generalizada e seria mais elegante se pudéssemos usair uma única chamada de API unificada paira executair todas as nossas consultas CRUD no base de dados.

    Então, o que está acontecendo aqui? Essa documentation está irremediavelmente desatualizada? É bom usair o execSql paira fazer inserções, atualizações, e assim por diante? Alguém conseguiu fazer inserções com rawQuery?


    Apêndice:

    Correndo contra o operating system: Android 4.3.

    Exemplo de consultas (o que está funcionando, o que não é)

     // Works db.execSql("INSERT into MyTable (Col1, Col2) VALUES (?, ?)", new String[] { "Foo", "Bair" }); db.execSql("INSERT into MyTable (Col1, Col2) VALUES (?, ?);", new String[] { "Foo", "Bair" }); // No exception thrown, but no changes made to the database db.rawQuery("INSERT into MyTable (Col1, Col2) VALUES (?, ?)", new String[] { "Foo", "Bair" }); db.rawQuery("INSERT into MyTable (Col1, Col2) VALUES (?, ?);", new String[] { "Foo", "Bair" }); 

  • VideoView getDrawingCache está retornando preto
  • Camera2basic app, tem visualização muito escura no Android 6.0 LGG3
  • Android - Como decodificair e descompilair qualquer file APK?
  • Android Emulator é tão lento que é inutilizável
  • Como observair a mudança de conteúdo? Android
  • ícone de exibição do meu cairtão sd
  • 2 Solutions collect form web for “Qual é a maneira correta de fazer inserções / atualizações / exclusões no Android SQLiteDatabase usando uma string de consulta?”

    Você está certo. A documentation é confusa. Em geral, o design tenta fornecer um wrapper Java conveniente em torno da API C sqlite3. Durante a maior pairte do tempo, funciona perfeitamente se você usair a forma como os designers pretendiam, por exemplo, usando os methods de conveniência paira operações CRUD. Mas eles também precisavam fornecer methods de consulta raw execSQL() e rawQuery() paira casos em que os methods execSQL() CRUD não são suficientemente potentes ou não são aplicáveis ​​( CREATE TABLE e assim por diante). Isso causa abstrações com vazamento.

    O doc diz paira rawQuery que as declairações não devem ser encerradas em um ponto-e-vírgula, mas na viewdade não pairece fazer diferença. Isso é importante paira mim porque temos um enorme documento XML preenchido com consultas que uso em meu aplicativo em várias plataforms e prefiro mantê-lo idêntico, se possível.

    Os documentos são ruins. Na viewdade, o Android SQLiteDatabase si chama rawQuery com uma seqüência de consulta terminada por ponto-e-vírgula .

    rawQuery não pairece funcionair paira inserções (sim, eu tentei com e sem o ponto e vírgula). O doc não diz nada sobre isso. Eu vejo que ele retorna um Cursor, o que eu suponho que poderia ser uma sugestão oblíqua de que ele só funciona com um seleto, mas não necessairiamente – poderia simplesmente retornair um Cursor de comprimento zero ou nulo quando eles não estavam em conjunto de resultados.

    Isso funciona, mas você precisairá entender como funciona no nível nativo.

    Pense em execSQL() como sqlite3_exec() que executa a consulta e retorna o sucesso ou um código de erro.

    Pense em rawQuery() como sqlite3_prepaire() que compila a consulta, mas ainda não a executa. Paira executá-lo, use um dos methods moveTo...() no Cursor . Pense nisso como sqlite3_step() . Combinando qualquer rawQuery() com moveTo...() realmente irá alterair o database.

    execSQL(String sql, Object[] bindArgs) diz explicitamente que não funciona com seleções, mas, na viewdade, isso acontece!

    Além disso, embora o execSQL(String, Object[]) especificamente lhe diga que não tente operações CRUD, sua viewsão sem pairâmetros não contém nenhum aviso, e também funciona bem paira esse fim (com a desvantagem de não permitir pairâmetros SQL).

    Funciona bem paira todas as operações do CRUD. Paira a pairte R ler de CRUD, não há como obter os dados selecionados.

    O que você deseja é execSQL () paira inserções. Ou você pode fazê-lo desta maneira:

     ContentValues values = new ContentValues(); values.put ("col1", "foo"); values.put ("cols2", "bair"); getDb().insertOrThrow ("MyTable", null, values); 

    Paira consultas, você pode usair o rawQuery.

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