使用SQLiteDatabase.execSQL执行多个语句

时间:2010-09-27 16:45:08

标签: android database sqlite

我遵循了使用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个String来执行多个SQL语句。我怎么能这样做,因为SQLiteDatabase.execSQL只允许1个语句?

5 个答案:

答案 0 :(得分:40)

使用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);
}

答案 1 :(得分:19)

嗯,在我的情况下,我正在从我保存为资产的文件中删除查询 这是我使用的解决方案+ -

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

答案 2 :(得分:1)

尝试这样的事情:

    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");

答案 3 :(得分:0)

从SQLiteDatabase的文档和我过去的经验来看,我认为这是不可能的。但是你为什么不把它分成单一的陈述呢?在你的例子中,这确实不是问题。或者你需要它用于不同的用例吗?

答案 4 :(得分:0)

我们在这里有很多回答。 这是我的多个插入语句的解决方案,但是我在资产不在行中使用了一个文件,这个文件中的每一行都是一个插入语句。

    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) {

    }