代码之家  ›  专栏  ›  技术社区  ›  Andrew

使用sqliteDatabase.execsql执行多个语句

  •  35
  • Andrew  · 技术社区  · 16 年前

    我遵循了使用Android构建数据库的标准教程。我创建了一个名为dbhelper的类,它扩展了sqliteOpenHelper。我重写了创建处理程序来执行字符串。

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(DbDefinitions.DB_CREATE);
    }
    

    dbdefinitions.db_create是我创建的静态字符串。

    public static final String TABLE_MESSAGES = "messages";
    public static final String TABLE_FRIENDS = "friends";
    
    public static final String STATE_OK = "STATE_OK";
    
    public static final String DB_CREATE = 
        "create table " + TABLE_MESSAGES + " (_id integer primary key, user_id integer not null, created_on integer, subject text not null, summary text not null, messagetext text null, read integer not null, status text not null default '" + STATE_OK + "'); " +
        "create table " + TABLE_FRIENDS + " (_id integer primary key, user_id integer not null, friend_id integer not null, created_on integer, status text not null default '" + STATE_OK + "');";
    

    我想使用1个字符串来执行多个SQL语句。如果sqliteDatabase.execsql只允许1条语句,我该怎么做?

    5 回复  |  直到 9 年前
        1
  •  40
  •   Cristian    16 年前

    使用Android附带的标准方法是不可能做到这一点的。所以,如果你想执行 批处理 对于多个SQL语句,您必须创建自己的实用程序才能这样做。例如,您可以有如下内容:

    public void executeBatchSql(String sql){
        // use something like StringTokenizer to separate sql statements
        for each sql statement{
            database.execSQL(oneStatement);
        }
    }
    

    不过,我会这样做:

    String sql1 = "create bla bla bla;";
    String sql2 = "create foo bar;";
    String[] statements = new String[]{sql1, sql2};
    
    // then
    for(String sql : statements){
        database.execSQL(sql);
    }
    
        2
  •  19
  •   frostymarvelous    9 年前

    在我的例子中,我正在从一个我保存为资产的文件中执行查询。 这是我用的解决方案+-

    String script = readAsset(CREATE_SCRIPT);//readAsset is a method i use to get the file contents
    try {
         String[] queries = script.split(";");
     for(String query : queries){
            db.execSQL(query);
         }
     } catch (Exception e) {
        .....
    

    编辑

    在我的例子中,查询是简单的插入查询,我完全控制它。但是,关于其中包含“;”的查询,已经提出了这个问题。

    @TwisterRob建议使用

    script.split(";$");// $ meaning end of line. You will need to use RegexOption.MULTILINE for this to work
    

    或

    script.split(";\n");// but you will need to ensure that each query is on a different line
    
        3
  •  0
  •   mreichelt    16 年前

    根据sqliteDatabase的文档和我过去的经验,我认为这是不可能的。但你为什么不把它分成几句话呢?在您的示例中,这实际上不是一个问题。或者您需要它来处理不同的用例?

        4
  •  0
  •   Eng. Samer T    12 年前

    我们有很多很好的答案。 这里是我对多个insert语句的解决方案,但是我在assets中使用了一个文件,而不是在行中,这个文件中的每一行都是insert语句。

        try {
            in = getAssets().open("InsertStatemets.SQL");
            BufferedReader reader = new BufferedReader(new InputStreamReader(in));
            line = reader.readLine();
    
            while (line != null){
                db.execSQL(line);
                Log.e("Insert Statement",  line); 
            }
    
        } catch (Exception e) {
    
        }
    
        5
  •  0
  •   Douglas Nassif Roma Junior    11 年前

    尝试如下操作:

        try {
            InputStream is = this.context.getAssets().open("script.sql");
            BufferedReader reader = new BufferedReader(new InputStreamReader(is));
            String line;
            while ((line = reader.readLine()) != null) {
                Log.i("SQL Script", line);
                if (!line.isEmpty() && !line.trim().startsWith("--"))
                    db.execSQL(line);
            }
        } catch (IOException e) {
            Log.e("SQL Script", e.getMessage());
        }
        Log.i("SQL Script", "script executed");
    
    推荐文章