sqlite如何在android上编译,如何在Android中使用SQLITE中的准备语句?

对于Android中准备好的SQLite语句,有SQLiteStatement..准备好的语句可以帮助您提高性能(特别是需要多次执行的语句),还有助于避免注入攻击。看见这篇文章就准备好的发言进行一般性讨论。

SQLiteStatement用于不返回多个值的SQL语句。(这意味着您不会在大多数查询中使用它们。)以下是一些例子:String sql = "CREATE TABLE table_name (column_1 INTEGER PRIMARY KEY, column_2 TEXT)";SQLiteStatement stmt = db.compileStatement(sql);

stmt.execute();

这个execute()方法不返回值,因此与CREATE和DROP一起使用比较合适,但不适合与SELECT、INSERT、DELETE和UPDATE一起使用,因为这些返回值。(但见这个问题.)String sql = "INSERT INTO table_name (column_1, column_2) VALUES (57, 'hello')";SQLiteStatement statement = db.compileStatement(sql);

long rowId = statement.executeInsert();

注意,executeInsert()方法被使用而不是execute()..当然,您不希望总是在每一行中输入相同的内容。所以你可以用绑定.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();

通常,当您想要快速重复某件事情(例如插入)很多次时,您会使用预先准备好的语句。准备好的语句使得SQL语句不必每次都被解析和编译。通过使用交易..这允许同时应用所有更改。以下是一个例子: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 

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

查看这些链接,以获得更多关于事务和加速数据库插入的更好信息。

这是一个基本的例子。您还可以应用上述部分中的概念。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中引入。见这个问答.

下面是一个例子。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();}

通常,当您运行一个查询时,您希望得到一个包含许多行的游标。不是这样的SQLiteStatement不过是为了。除非您只需要一个简单的结果,例如数据库中的行数,否则不会使用它来运行查询。simpleQueryForLong()String sql = "SELECT COUNT(*) FROM table_name";SQLiteStatement statement = db.compileStatement(sql);

long result = statement.simpleQueryForLong();

通常,您将运行query()方法SQLiteDatabase才能得到光标。SQLiteDatabase db = dbHelper.getReadableDatabase();String table = "table_name";String[] columnsToReturn = { "column_1", "column_2" };

String selection = "column_1 =?";String[] selectionArgs = { someValue };

// matched to "?" in selectionCursor dbCursor = db.query(table, columnsToReturn, selection, selectionArgs, null, null, null);

看见这个答案有关查询的更详细信息。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值