如何在 Android sqlite 中使用准备好的语句? [复制]

Posted

技术标签:

【中文标题】如何在 Android sqlite 中使用准备好的语句? [复制]【英文标题】:How to use prepared statements with Android sqlite? [duplicate] 【发布时间】: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 吗? 我在您的预期目标的视图(愿景)中发布了该评论。 【参考方案1】:

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

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

【讨论】:

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

以上是关于如何在 Android sqlite 中使用准备好的语句? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

在 SQLite3 和 PHP 中使用准备好的语句

在哪里使用 JDBC 创建准备好的语句?

如何在 node.js 中使用 sqlite3 执行批量插入?

SQLITE JDBC 驱动程序准备好的语句失败(内部指针 0)

如何在 android 中打开 SQLite 数据库?

将数据库从 PhPMyAdmin 导入到 Android