如何在Android中的SQlite中使用預準備語句?如何在Android中的SQlite中使用預準備語句?
回答
我使用Android的準備語句的時候,它是相當簡單:
SQLiteDatabase db = dbHelper.getWritableDatabase();
SQLiteStatement stmt = db.compileStatement("SELECT * FROM Country WHERE code = ?");
stmt.bindString(1, "US");
stmt.execute();
準備好的語句是否可以將參數設置爲非值?像「SELECT * FROM?」? – Pablo 2009-01-20 06:16:51
jasonhudgins例如將無法正常工作。您無法使用stmt.execute()
執行查詢並返回值(或Cursor
)。
只能預編譯根本不返回任何行(如插入或創建表語句)或單個行和列(並使用simpleQueryForLong()
或simpleQueryForString()
)的語句。
如果你想在返回遊標,那麼你可以考慮這樣的事情:
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"));
你想有一個更完整的一個看到這個片段Genscripts萬一。請注意,這是一個參數化的SQL查詢,所以本質上它是一個準備好的語句。
要獲得遊標,您不能使用compiledStatement。然而,如果你想使用完整準備的SQL語句,我推薦改編jbaez的方法...使用db.rawQuery()
而不是db.query()
。
對於Android中準備好的SQLite語句,有SQLiteStatement。準備好的語句可以幫助你提高性能(特別是對於需要多次執行的語句),並且還有助於避免注入攻擊。請參閱this article以獲取有關預準備報表的一般性討論。
SQLiteStatement
旨在與不返回多個值的SQL語句一起使用。 (這意味着你不會用他們最查詢。)下面是一些例子:
Create a table
String sql = "CREATE TABLE table_name (column_1 INTEGER PRIMARY KEY, column_2 TEXT)";
SQLiteStatement stmt = db.compileStatement(sql);
stmt.execute();
所以宜用與創建和刪除,但要使用的execute()
方法不返回一個值不打算與SELECT,INSERT,DELETE和UPDATE一起使用,因爲這些返回值。 (但見this question。)
Insert values
String sql = "INSERT INTO table_name (column_1, column_2) VALUES (57, 'hello')";
SQLiteStatement statement = db.compileStatement(sql);
long rowId = statement.executeInsert();
注意,executeInsert()
方法而不是使用。當然,你不想每次都輸入相同的東西。爲此,您可以使用bindings。
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); // These match to the two question marks in the sql string
statement.bindString(2, stringValue);
long rowId = statement.executeInsert();
通常,當您想要快速重複某些操作(如INSERT)多次時使用預準備語句。準備好的語句使得SQL語句不必每次都被解析和編譯。通過使用transactions,您可以加快速度。這允許一次應用所有更改。以下是一個示例:
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();
}
查看這些鏈接,獲取關於事務和加速數據庫插入的更多信息。
- Atomic Commit In SQLite(大在深入說明,請轉到第3)
- Database transactions
- Android SQLite bulk insert and update example
- Android SQLite Transaction Example with INSERT Prepared Statement
- Turbocharge your SQLite inserts on Android
- https://stackoverflow.com/a/8163179/3681880
Update rows
這是一個基本的例子。您也可以應用上述部分的概念。
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();
注:executeUpdateDelete()
也可用於DELETE語句和API 11 See this Q&A進行了介紹。
Query
通常,當您運行查詢,你想要得到的光標回來了大量的行。雖然這不是SQLiteStatement
。你不運行它的查詢,除非你只需要一個簡單的結果,像中行的數據庫的數量,這可以用simpleQueryForLong()
String sql = "SELECT COUNT(*) FROM table_name";
SQLiteStatement statement = db.compileStatement(sql);
long result = statement.simpleQueryForLong();
做通常你會運行的SQLiteDatabase的query()
方法獲取一個遊標。
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);
有關查詢的更多詳細信息,請參閱this answer。
- 1. 在BoneCP中使用預準備語句
- 2. 在SQLite中使用預準備語句和全文搜索
- 3. 在SQL中使用IN函數中的預準備語句
- 4. SQLite3中的「預先準備好」語句?
- 5. 如何在iPhone中爲SQLite編寫準備好的語句
- 6. PHP MySQLInsert預準備語句
- 7. 使用準備好的語句時的預定義語句
- 8. PHP在準備好的語句中準備了語句
- 9. 使用準備語句與sqlite交易語句
- 10. 如何使用預準備語句防止C語言中的SQL注入?
- 11. 如何使用準備好的語句
- 12. 如何使用預準備語句在Python/Django中的SQlite中插入MULTIPLE記錄?
- 13. 如何在Ruby/Rails中構建/運行預準備語句?
- 14. 如何在Java中創建動態預準備語句?
- 15. 如何在Node.JS中爲MSSQL創建預準備語句?
- 16. 如何在C中爲mysql查詢設置預準備語句?
- 17. 在java中準備語句
- 18. 查詢與Android中的準備語句?
- 19. 準備好的SQLite語句在iPhone中佔用多少內存?
- 20. 無論如何使用OCI在PHP中預覽準備好的SQL語句?
- 21. 如何使用jdbc在java中準備語句讀取sqlite文本列?
- 22. 如何在MySQL語句中使用SQL語句中的引用在PHP中準備語句?
- 23. 在DBI準備語句中重複使用?準備
- 24. 如何使用bindvalue和%準備語句?
- 25. 如何修復SQLSTATE [42000]錯誤;使用預準備語句
- 26. 如何在準備好的語句中使用sql函數CONCAT
- 27. 如何在準備好的語句中使用tablename佔位符?
- 28. PostgreSQL中的準備語句
- 29. MySQL中使用變量準備語句
- 30. 如何使用PHP中的預準備語句從mysql更改爲pdo?
考慮改變接受的答案。 – Suragch 2015-06-29 10:55:00
同意 - 考慮改變答案......當有更好的解決方案存在時,從衆心態提高了接受的答案。 – LamonteCristo 2015-07-28 04:54:49
巴勃羅,請改變接受的答案...給出的例子甚至沒有運行。我們的降價還不足以取消它。 – SparK 2016-04-18 16:31:54