SQLiteStatement预编译语句的好习惯

时间:2013-09-13 21:17:49

标签: java android sqlite

我的问题涉及使用SQLiteDatabase.compileStatement创建的预编译SQL语句。在我看到的所有示例中,首先是预编译,添加了下一个参数,然后执行该语句。

但是我觉得使用预编译语句是有道理的,如果我在开始时将它们预编译一次,那么我使用以前预编译的语句很多次只给它们新的参数。

这样的问题。有没有好的做法,在哪里(在什么时候,哪个类的哪个方法)预先编译这些语句以及如何执行它们。

我想知道扩展SQLiteOpenHelper类(实际上我必须扩展它以覆盖onCreate和onUpdate方法)并在构造函数中首先添加我的所有sql语句的预编译,然后创建我自己的方法以确保访问到我的数据库(=绑定参数和执行语句旁边)。

这是一个好方法吗?如果现在,有什么好的做法?

1 个答案:

答案 0 :(得分:0)

为了澄清情况,举个例子:

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代码,但我相信它给出了我想要实现的一个很好的例子。简单的sql语句只有在第一次使用时才会预编译。接下来它保留供将来使用。

问题是你如何考虑这样的解决方案。

另一个在什么时候我可以创建MySQLStatements对象?可以在我的类的构造函数中完成从SQLiteOpenHelper派生的最后一件事吗?但是通过getWritableDatabase方法获取db是安全的。在onCreate方法中,onUpdate可以跳过给定的db参数并使用之前得到的构造函数(通过getWritableDatabase)吗?