我的问题涉及使用 SQLiteDatabase.compileStatement 创建的预编译 SQL 语句。在我见过的所有示例中,首先是预编译,然后添加参数,然后执行语句。
但是,我的印象是,如果我在开始的某个地方预编译它们一次,然后我多次使用以前的预编译语句,只给它们新的参数,那么使用预编译语句是有意义的。
所以这个问题。是否有任何好的实践,在哪里(在什么时刻,哪个类的什么方法)预编译这些语句以及接下来如何执行它们。
我想知道如何扩展 SQLiteOpenHelper 类(事实上,我必须始终扩展它以覆盖 onCreate 和 onUpdate 方法),并首先在构造函数中添加我所有 sql 语句的预编译,然后创建我自己的方法以确保访问到我的数据库(=绑定(bind)参数,然后执行语句)。
这是一个好方法吗?如果现在,什么是好的做法?
最佳答案
为了澄清情况,举个例子:
public class MySQLStatements
SQLiteDatabase db;
SQLiteStatement recordInsert;
public SQLDatabaseAndroid (SQLiteDatabase db){
this.db=db;
}
public void tableCreateExecute () {
db.execSQL ("CREATE TABLE....");
}
public long recordInsertExecute (par1, par2 etc....) {
// let's precompile sql statement if it hasn't been previously used
recordInsert = (recordInsert == null) ?
recordInsert = db.compileStatement(recordInsert()) : recordInsert;
and next sql part.
上面的部分不是完全正确的java代码,但我相信它给出了一个很好的例子,我想要实现什么。 Simply sql语句仅在第一次使用时才进行预编译。接下来,将其保留以供将来使用。
问题是您对这样的解决方案有何看法。
另一个问题是我什么时候可以创建 MySQLStatements 对象?作为最后要做的事情,可以在从 SQLiteOpenHelper 派生的类的构造函数中完成吗?但是通过 getWritableDatabase 方法获取 db 是安全的。在 onCreate、onUpdate 方法中,我可以跳过给定的 db 参数并使用之前在构造函数中获取的参数(通过 getWritableDatabase)吗?
关于java - SQLiteStatement预编译语句良好实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18795404/