【问题标题】:How to use prepared statements with Android sqlite? [duplicate]如何在 Android sqlite 中使用准备好的语句? [复制]
【发布时间】:2014-03-23 05:33:43
【问题描述】:

所以我想了解如何准确处理准备好的语句?我有这段代码,但我不确定它是否使用预准备语句或如何向其中添加预准备语句。

代码:

/*
     * Creating a word
     */
    public long createword(DatabaseWords word) {
        SQLiteDatabase db = this.getWritableDatabase();

        ContentValues values = new ContentValues();
        values.put(KEY_DICTIONARYID, word.get_dictionaryId());
        values.put(KEY_WORD1, word.get_word1());
        values.put(KEY_WORD2, word.get_word2());
        values.put(KEY_WORD3, word.get_word3());
        values.put(KEY_WORD4, word.get_word4());

        // insert row
        long word_id = db.insert(TABLE_WORDS, null, values);

        return word_id;

    }

如何将准备好的语句包含到 A. 让它运行得更快,B. 防止对 db 的攻击

【问题讨论】:

  • insertHelper 已折旧,您应该使用事务。
  • 问题是什么,真的吗?
  • 如何将准备好的语句包含到 A. 让它运行得更快,B. 防止对 db 的攻击
  • @Nun Chai 我什至在使用 insertHelper 吗?
  • 我在您的预期目标的视图(愿景)中发布了该评论。

标签: android sql database sqlite prepared-statement


【解决方案1】:

是的,insert() 在后台使用准备好的语句:sqlite_prepare_v2() 编译 SQL,然后 sqlite3_bind_*() 绑定来自ContentValues 的参数。这可以防止常见的 SQL 注入攻击。

要使用准备好的语句来提高性能,即只编译一次 SQL,并为具有不同绑定参数的多个查询重用相同的准备好的语句,请参阅 SQLiteDatabase.compileStatement()SQLiteStatement

【讨论】:

  • 哦,好的,所以我不需要做任何其他事情了吗?
  • 它本质上不是已经为多个查询调用了相同的东西(我的代码),只是与每个单词有关的参数?
  • 不,目前对insert() 的每次调用都会准备一个新语句(本质上是sqlite“字节码”中的程序)并使用给定的参数运行它。使用SQLiteStatements,您可以使用不同的参数运行相同的程序 - 如果您一遍又一遍地使用相同类型的查询,这很有用。
  • 你能给我举个例子吗?
  • Artoo Detoo链接的副本有一个简单的例子。
猜你喜欢
  • 2010-09-30
  • 2014-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多