用SQLiteDatabase.execSQL执行多个语句

我遵循一个标准的教程,用Android构build数据库。 我创build了一个名为DbHelper的类,它扩展了SQLiteOpenHelper。 我已经重写了创build处理程序来执行一个string。

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

DbDefinitions.DB_CREATE是我创build的一个静态string。

 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语句?

使用Android自带的标准方法是不可能的。 所以,如果你想执行一批多个SQL语句,你将不得不创build你自己的工具来这样做。 例如,你可以有这样的东西:

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

那么,在我的情况下,我正在删除一个文件,作为一个资产保存的查询这是我使用的解决scheme+

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

编辑

就我而言,查询是我完全控制的简单插入查询。 但是,有关“疑问”的问题已经提出, 在他们里面。

@TWiStErRobbuild议使用

 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 

从SQLiteDatabase的文档和我的经验,我认为这是不可能的。 但是你为什么不把它分成单独的陈述呢? 你的例子真的不是问题。 或者你需要一个不同的用例吗?

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

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

尝试这样的事情:

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