Como faço para usar instruções preparadas em SQlite no Android?
android
sqlite
prepared-statement
pupeno
fonte
fonte
Respostas:
Eu uso declarações preparadas no Android o tempo todo, é bastante simples:
fonte
SQLiteStatement.bindXXX()
tem um índice baseado em 1, não baseado em 0 como a maioria dos outros.Para instruções SQLite preparadas no Android, existe SQLiteStatement . As instruções preparadas ajudam a acelerar o desempenho (especialmente para instruções que precisam ser executadas várias vezes) e também ajudam a evitar ataques de injeção. Veja este artigo para uma discussão geral sobre as declarações preparadas.
SQLiteStatement
deve ser usado com instruções SQL que não retornam vários valores. (Isso significa que você não os usaria para a maioria das consultas.) Abaixo estão alguns exemplos:Crie uma mesa
O
execute()
método não retorna um valor, portanto, é apropriado para ser usado com CREATE e DROP, mas não se destina a ser usado com SELECT, INSERT, DELETE e UPDATE porque esses valores retornam. (Mas veja esta pergunta .)Inserir valores
Observe que o
executeInsert()
método é usado em vez deexecute()
. Claro, você não gostaria de inserir sempre as mesmas coisas em todas as linhas. Para isso, você pode usar ligações .Normalmente, você usa instruções preparadas quando deseja repetir algo rapidamente (como um INSERT) muitas vezes. A instrução preparada faz com que a instrução SQL não precise ser analisada e compilada todas as vezes. Você pode acelerar as coisas ainda mais usando transações . Isso permite que todas as alterações sejam aplicadas de uma vez. Aqui está um exemplo:
Confira esses links para mais informações sobre transações e como agilizar as inserções no banco de dados.
Atualizar linhas
Este é um exemplo básico. Você também pode aplicar os conceitos da seção acima.
Excluir linhas
O
executeUpdateDelete()
método também pode ser usado para instruções DELETE e foi introduzido na API 11. Veja este Q&A .Aqui está um exemplo.
Inquerir
Normalmente, quando você executa uma consulta, deseja obter um cursor de volta com muitas linhas. Mas não
SQLiteStatement
é para isso. Você não executa uma consulta com ele, a menos que precise apenas de um resultado simples, como o número de linhas no banco de dados, o que pode ser feito comsimpleQueryForLong()
Normalmente, você executará o
query()
método SQLiteDatabase para obter um cursor.Veja esta resposta para maiores detalhes sobre as dúvidas.
fonte
clearBindings()
não apenas os define comonull
(consulte o código-fonte ). Eu vejo isso como uma limpeza do estado para que nada o influencie do loop anterior. Talvez isso não seja necessário. Eu ficaria feliz se alguém que sabe comentar.Se você quiser um cursor no retorno, pode considerar algo assim:
Veja este snippet Genscripts caso queira um mais completo. Observe que esta é uma consulta SQL parametrizada, portanto, em essência, é uma instrução preparada.
fonte
O exemplo de jasonhudgins não funcionará. Você não pode executar uma consulta com
stmt.execute()
e obter um valor (ou aCursor
) de volta.Você só pode pré-compilar instruções que não retornem nenhuma linha (como uma instrução de inserção ou criação de tabela) ou uma única linha e coluna (e use
simpleQueryForLong()
ousimpleQueryForString()
).fonte
Para obter um cursor, você não pode usar um compiledStatement. No entanto, se você quiser usar uma instrução SQL totalmente preparada, recomendo uma adaptação do método de jbaez ... Usando em
db.rawQuery()
vez dedb.query()
.fonte