我遵循了使用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个语句?
答案 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) {
}