Jak mohu použít připravené prohlášení v SQLite v Androidu?

hlasů
85

Jak mohu použít připravené prohlášení v SQLite v Androidu?

Položena 11/01/2009 v 19:38
zdroj uživatelem
V jiných jazycích...                            


5 odpovědí

hlasů
134

U připravených SQLite závěrky v Androidu je SQLiteStatement . Připravené příkazy pomůže urychlit výkon (zejména pro příkazy, které musí být provedeny vícekrát) a také pomoci vyhnout se před injection útoky. Viz tento článek pro obecnou diskusi o připravených příkazů.

SQLiteStatementJe určen pro použití s ​​SQL příkazů, které nevrací více hodnot. (To znamená, že nebude používat pro většinu dotazů.) Níže jsou uvedeny některé příklady:

Vytvoření tabulky

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

execute()Metoda nevrací hodnotu, takže je vhodné pro použití s vytváření a rušení, ale nejsou určeny k použití s SELECT, vložka ignorovat, DELETE a UPDATE, protože tyto hodnoty návratu. (Ale vidět tuto otázku .)

Vložte hodnoty

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

Všimněte si, že executeInsert()metoda se používá namísto execute(). Samozřejmě, že byste nechtěli, aby se vždy zadávat stejné věci v každém řádku. K tomu můžete použít vazby .

String sql = "INSERT IGNORE  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();

Obvykle použijete připravené prohlášení, když chcete rychle zopakovat něco (jako INSERT IGNORE) mnohokrát. Připravený prohlášení dělá to tak, že příkaz SQL nemusí být analyzován a zkompilovaný pokaždé. Můžete urychlit ještě více pomocí transakcí . To umožňuje, aby všechny změny, které mají být použity najednou. Zde je příklad:

String stringValue = "hello";
try {

    db.beginTransaction();
    String sql = "INSERT IGNORE  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();
}

Podívejte se na tyto odkazy k nějaké další dobré informace o transakcích a urychlení databázových vložek.

Aktualizovat řádky

Jedná se o základní příklad. Můžete také použít koncepty ze sekce výše.

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();

Poznámka: executeUpdateDelete()lze také použít pro DELETE a byl představen v API 11. Viz tento Q & A .

Dotaz

Za normálních okolností při spuštění dotazu, chcete získat kurzor zpět se spoustou řádků. To není to, co SQLiteStatementje pro, ačkoli. Nemusíte spustit dotaz s ním, pokud budete potřebovat pouze jednoduchý výsledek, stejně jako počet řádků v databázi, kterou můžete dělat ssimpleQueryForLong()

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

Obvykle budete spustit query()metodu SQLiteDatabase získat kurzor.

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);

Viz tuto odpověď pro lepší detaily o dotazů.

Odpovězeno 22/04/2015 v 12:13
zdroj uživatelem

hlasů
25

Používám připravené prohlášení v Android po celou dobu, je to docela jednoduché:

SQLiteDatabase db = dbHelper.getWritableDatabase();
SQLiteStatement stmt = db.compileStatement("SELECT * FROM Country WHERE code = ?");
stmt.bindString(1, "US");
stmt.execute();
Odpovězeno 12/01/2009 v 18:12
zdroj uživatelem

hlasů
21

Chcete-li kurzor na oplátku, pak byste měli zvážit něco takového:

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"));

Viz Fragment Genscripts v případě, že chcete úplnější jeden. Všimněte si, že se jedná o parametrizovaný SQL dotaz, takže v podstatě je to připravený příkaz.

Odpovězeno 03/09/2010 v 15:55
zdroj uživatelem

hlasů
9

jasonhudgins příklad nebude fungovat. Nelze spustit dotaz se stmt.execute()a získat hodnotu (nebo Cursor) dozadu.

Můžete pouze prekompilace prohlášení, která buď vrátí žádné řádky vůbec (jako vložka, nebo CREATE TABLE) nebo jeden řádek a sloupec (a používají simpleQueryForLong()nebo simpleQueryForString()).

Odpovězeno 06/06/2010 v 10:15
zdroj uživatelem

hlasů
1

Chcete-li získat kurzor nelze použít compiledStatement. Nicméně, chcete-li použít plnou připravený příkaz SQL, doporučuji adaptaci metody jbaez je ... Použití db.rawQuery()místo db.query().

Odpovězeno 14/10/2010 v 19:58
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more