Exécution de plusieurs instructions avec SQLiteDatabase.execSQL

j'ai suivi un tutoriel standard pour construire une base de données avec Android. J'ai créé une classe appelée DbHelper qui étend SQLiteOpenHelper. J'ai remplacé le gestionnaire de création pour exécuter une chaîne.

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

DbDefinitions.DB_CREATE est une chaîne statique que j'ai créée.

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

j'aimerais utiliser une chaîne de caractères pour exécuter plusieurs instructions SQL. Comment puis-je faire ce que SQLiteDatabase.execSQL n'autorise qu'une déclaration?

34
demandé sur Andrew 2010-09-27 20:45:07

5 réponses

ce n'est pas possible de faire en utilisant les méthodes standard qui vient avec Android. Donc, si vous voulez exécuter lot de plusieurs instructions SQL, vous devrez créer votre propre utilitaire pour le faire. Par exemple, vous pouvez avoir quelque chose comme ceci:

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

Bien, ce que je ferais, c'est quelque chose comme ceci:

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);
}
37
répondu Cristian 2010-09-27 17:03:20

Eh bien, dans mon cas, je supprime les requêtes d'un fichier que j'ai enregistré comme un atout C'est la solution que j'ai utilisée+-

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

EDIT

dans mon cas, les requêtes étaient de simples requêtes insert sur lesquelles j'avais un contrôle total. Cependant, la question a été soulevée concernant les questions avec ";" à l'intérieur d'eux.

@TWiStErRob suggère d'utiliser

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

ou

script.split(";\n");// but you will need to ensure that each query is on a different line
17
répondu frostymarvelous 2016-10-20 09:10:53

D'après la documentation de SQLiteDatabase et mon expérience dans le passé, je pense que ce n'est pas possible. Mais pourquoi ne pas le diviser en deux? Elle est vraiment pas un problème dans votre exemple. Ou en avez-vous besoin pour une autre utilisation?

0
répondu mreichelt 2010-09-27 16:58:45

nous avons beaucoup de réponses greate ici. et voici ma solution pour les insertions multiples, cependant j'ai utilisé un fichier dans les actifs pas dans la rangée, chaque ligne dans ce fichier est une insertion statement.

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

    }
0
répondu Eng. Samer T 2014-09-25 23:38:16

Essayez quelque chose comme ceci:

    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");
0
répondu Douglas Nassif Roma Junior 2014-12-01 16:53:53