Comment utiliser des déclarations préparées dans SQlite dans Android?

Comment utiliser des déclarations préparées dans SQlite dans Android?
Invité:

Dominique

Confirmation de:

Pour préparé SQLite Déclarations B. Android il y a
http://developer.android.com/r ... .html
. Les opérateurs préparés aident à accélérer les performances /Surtout pour les opérateurs à exécuter plusieurs fois/, Et également aider à éviter les attaques en utilisant des injections. Cm.
http://en.wikipedia.org/wiki/Prepared_statement
Pour une discussion générale sur les applications préparées.


SQLiteStatement

Conçu pour une utilisation avec des opérateurs SQL, qui ne renvoie pas plusieurs valeurs. /Cela signifie que vous ne les utiliserez pas pour la plupart des demandes./ Vous trouverez ci-dessous quelques exemples:

http://www.tutorialspoint.com/ ... e.htm

String sql = "CREATE TABLE table_name /column_1 INTEGER PRIMARY KEY, column_2 TEXT/";
SQLiteStatement stmt = db.compileStatement/sql/;
stmt.execute//;


Méthode
execute//

ne renvoie pas les valeurs, il peut donc être utilisé avec CREATE et DROP, Mais il n'est pas destiné à être utilisé avec SELECT, INSERT, DELETE et UPDATE, Parce qu'ils renvoient des valeurs. /Mais voir
https://coderoad.ru/13365558/
./

http://www.tutorialspoint.com/ ... y.htm

String sql = "INSERT INTO table_name /column_1, column_2/ VALUES /57, 'hello'/";
SQLiteStatement statement = db.compileStatement/sql/;
long rowId = statement.executeInsert//;


Notez que la méthode est utilisée
http://developer.android.com/r ... %2529
, mais non
execute//

. Bien sûr, vous ne voudriez pas toujours entrer dans les mêmes choses dans chaque ligne. Pour cela, vous pouvez utiliser
http://developer.android.com/r ... .html
.


String sql = "INSERT INTO table_name /column_1, column_2/ VALUES /?, ?/";
SQLiteStatement statement = db.compileStatement/sql/;

int intValue = 57;
String stringValue = "hello";

statement.bindLong/1, intValue/; // 1-based: matches first '?' in sql string
statement.bindString/2, stringValue/; // matches second '?' in sql string

long rowId = statement.executeInsert//;


Habituellement, vous utilisez des opérateurs préparés lorsque vous souhaitez répéter rapidement quelque chose /par exemple, INSERT/ plusieurs fois. prepared statement le fait pour que l'opérateur SQL Il ne doit pas être analysé et compilé à chaque fois. Vous pouvez accélérer le processus encore plus en utilisant
https://www.sqlite.org/transactional.html
. Cela vous permet d'appliquer tous les changements immédiatement. Voici un exemple:


String stringValue = "hello";
try {

db.beginTransaction//;
String sql = "INSERT INTO table_name /column_1, column_2/ VALUES /?, ?/";
SQLiteStatement statement = db.compileStatement/sql/;

for /int i = 0; i < 1000; i++/ {
statement.clearBindings//;
statement.bindLong/1, i/;
statement.bindString/2, stringValue + i/;
statement.executeInsert//;
}

db.setTransactionSuccessful//; // This commits the transaction if there were no exceptions

} catch /Exception e/ {
Log.w/"Exception:", e/;
} finally {
db.endTransaction//;
}


Vérifiez ces liens pour plus d'informations sur les transactions et accélérez l'insert de base de données.

http://www.sqlite.org/atomiccommit.html
/Excellente explication détaillée, aller à la partie 3/

http://www.helloandroid.com/tu ... tions
Données

http://www.mysamplecode.com/20 ... .html
https://www.codeofaninja.com/2 ... .html
http://www.techrepublic.com/bl ... roid/

http://www.tutorialspoint.com/ ... y.htm
C'est l'exemple principal. Vous pouvez également appliquer des concepts de la section ci-dessus.


String sql = "UPDATE table_name SET column_2=? WHERE column_1=?";
SQLiteStatement statement = db.compileStatement/sql/;

int id = 7;
String stringValue = "hi there";

statement.bindString/1, stringValue/;
statement.bindLong/2, id/;

int numberOfRowsAffected = statement.executeUpdateDelete//;


https://www.tutorialspoint.com ... y.htm
Méthode
executeUpdateDelete//

peut également être utilisé pour les opérateurs DELETE et a été introduit dans API 11.
https://coderoad.ru/13365558/
.

Voici un exemple.


try {

db.beginTransaction//;
String sql = "DELETE FROM " + table_name +
" WHERE " + column_1 + " = ?";
SQLiteStatement statement = db.compileStatement/sql/;

for /Long id : words/ {
statement.clearBindings//;
statement.bindLong/1, id/;
statement.executeUpdateDelete//;
}

db.setTransactionSuccessful//;

} catch /SQLException e/ {
Log.w/"Exception:", e/;
} finally {
db.endTransaction//;
}


http://www.tutorialspoint.com/ ... y.htm
Habituellement, lorsque vous exécutez la demande, vous souhaitez récupérer le curseur avec un grand nombre de rangées. Mais ce n'est pas ce dont vous avez besoin
SQLiteStatement

. Vous n'exécutez pas de demande avec cela si vous n'avez pas besoin d'un simple résultat, tel que le nombre de lignes de la base de données que vous pouvez faire avec
http://developer.android.com/r ... %2529

String sql = "SELECT COUNT/*/ FROM table_name";
SQLiteStatement statement = db.compileStatement/sql/;
long result = statement.simpleQueryForLong//;


Habituellement, vous exécutez la méthode
query//

de SQLiteDatabase
http://developer.android.com/r ... .html
Pour obtenir le curseur.


SQLiteDatabase db = dbHelper.getReadableDatabase//;
String table = "table_name";
String[] columnsToReturn = { "column_1", "column_2" };
String selection = "column_1 =?";
String[] selectionArgs = { someValue }; // matched to "?" in selection
Cursor dbCursor = db.query/table, columnsToReturn, selection, selectionArgs, null, null, null/;


Cm.

Pour plus d'informations sur les demandes.

Catherine

Confirmation de:

Si vous avez besoin d'un curseur à votre retour, vous pouvez considérer quelque chose comme ceci:


SQLiteDatabase db = dbHelper.getWritableDatabase//;

public Cursor fetchByCountryCode/String strCountryCode/
{
/**
* SELECT * FROM Country
* WHERE code = US
*/
return cursor = db.query/true,
"Country", /**< Table name. */
null, /**< All the fields that you want the
cursor to contain; null means all.*/
"code=?", /**< WHERE statement without the WHERE clause. */
new String[] { strCountryCode }, /**< Selection arguments. */
null, null, null, null/;
}

/** Fill a cursor with the results. */
Cursor c = fetchByCountryCode/"US"/;

/** Retrieve data from the fields. */
String strCountryCode = c.getString/cursor.getColumnIndex/"code"//;

/** Assuming that you have a field/column with the name "country_name" */
String strCountryName = c.getString/cursor.getColumnIndex/"country_name"//;


Voir ce fragment
http://genscripts.net/snippets/view/entry/41
, Si vous avez besoin d'un plus complet. Notez qu'il s'agit d'une demande paramétrée. SQL, Donc, en fait, prepared statement.

Blanche

Confirmation de:

J'ai utilisé des allégations préparées dans Android, C'est assez simple :


SQLiteDatabase db = dbHelper.getWritableDatabase//;
SQLiteStatement stmt = db.compileStatement/"INSERT INTO Country /code/ VALUES /?/"/;
stmt.bindString/1, "US"/;
stmt.executeInsert//;

Alice

Confirmation de:

L'exemple de Jason Hudginis ne fonctionnera pas. Vous ne pouvez pas demander avec
stmt.execute//

et récupérer la valeur /ou
Cursor

/.

Vous ne pouvez que compiler uniquement les opérateurs qui ne renvoient aucune ligne du tout. /Par exemple, l'opérateur insert ou create table/, soit une chaîne et une colonne /et utilise
simpleQueryForLong//

ou
simpleQueryForString//

/.

Babette

Confirmation de:

Pour obtenir le curseur, vous ne pouvez pas utiliser compiledStatement. Cependant, si vous voulez utiliser un opérateur entièrement préparé SQL, Je recommande l'adaptation de la méthode jbaez... Utilisant

db.rawQuery//


au lieu

db.query//


.

Pour répondre aux questions, connectez-vous ou registre