2010-06-24 20 views
3

Ok, peut-être que je manque complètement quelque chose ici, mais je viens de commencer à travailler avec SQL et Android et de ce que je peux voir, met à jour et insère dans la base de données besoin d'être manipulé individuellement?Android: Insertion/Mise à jour de plusieurs enregistrements dans la base de données SQL

Je peux récupérer un curseur contenant plusieurs enregistrements, mais si je voulais appliquer une mise à jour à chaque enregistrement du curseur, je ne vois que comment le faire individuellement, en utilisant ContentValues ​​et Update(), puis le curseur rechargement ??

Même chose si je souhaite créer plusieurs nouveaux enregistrements, ceux-ci doivent être insérés individuellement? Est-ce que je ne peux pas créer une liste et un encart en masse?

Pour moi, cela semble lent et lourd, et il doit y avoir quelque chose que je ne suis pas encore au courant (recherche de réponses me manque ... probablement dû à l'utilisation de termes incorrects étant nouveau android/java)

Voici un exemple très simple de ce que je veux faire, mais il doit y avoir un meilleur moyen d'atteindre cette fonctionnalité. (Je sais qu'il ya d'autres mauvaises pratiques ici, juste créer un eample rapide)

public class HelloSQL extends Activity { 

    SQLiteDatabase myDB = null; 
    String TableName = "myTable"; 
    ContentValues myVals = new ContentValues(); 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     String Data = ""; 

     // Create a Database. 
     try { 
      myDB = this.openOrCreateDatabase("myTestDB", MODE_PRIVATE, null); 

      // Create a Table in the Database. 
      myDB.execSQL("CREATE TABLE IF NOT EXISTS " + TableName 
        + " (id INTEGER PRIMARY KEY AUTOINCREMENT," 
        + " Value1 INTEGER, Value2 INTEGER);"); 

      myDB.execSQL("DELETE FROM " + TableName); 

      // insert value1 
      for (int i = 0; i < 100; i++) { 
       myVals.put("Value1", i); 
       myDB.insert(TableName, null, myVals); 
      } 

      // retrieve data from database 
      Cursor c = myDB.rawQuery("SELECT * FROM " + TableName, null); 

      int colId = c.getColumnIndex("id"); 
      int col1 = c.getColumnIndex("Value1"); 
      int col2 = c.getColumnIndex("Value2"); 
      Random generator = new Random(); 

      // Loop through all values and update value2 
      c.moveToFirst(); 
      if (c != null) {     
       do {      
        long id = c.getLong(colId); 
        int val1 = c.getInt(col1); 
        int randomVal = generator.nextInt(99); 
        myVals.put("Value1", val1); 
        myVals.put("Value2", randomVal); 
        myDB.insert(TableName, null, myVals); 
        myDB.update(TableName, myVals, "id=?",new String[] {Long.toString(id)}); 
       } while (c.moveToNext()); 
      } 

      // requery data 
      c = myDB.rawQuery("SELECT * FROM " + TableName, null); 

      // display all values 
      c.moveToFirst(); 
      if (c != null) { 
       do { 
        int val1 = c.getInt(col1); 
        int val2 = c.getInt(col2); 
        Data = Data + Integer.toString(val1) + " " + Integer.toString(val2) + "\n"; 
       } while (c.moveToNext()); 
      }   


      TextView tv = new TextView(this); 
      tv.setText(Data); 
      setContentView(tv); 

     } catch (Exception e) { 
      Log.e("Error", "Error", e); 
     } finally { 
      if (myDB != null) 
       myDB.close(); 
     } 
    } 

Merci à l'avance, ne vous attendez pas à quiconque de tout récrire je l'ai fait, mais apoint dans le droit la direction et les liens vers un échantillon seraient grandement appréciés.

+0

CommonsWare est 100% vrai ...vous pouvez écrire n'importe quel code qui crache une instruction SQL, puis utiliser SQLiteDatabase.compileStatement ('your statment'), qui retourne un SQLiteStatement, puis exécuter execute() dessus. –

Répondre

2

mises à jour et inserts retour à la base de données doivent être traitées individuellement ? Les instructions "doivent être traitées individuellement" sur toutes les bases de données SQL auxquelles je peux penser, sur toutes les plateformes auxquelles je peux penser. Tout ce qui prend en charge un modèle d'insertion en bloc est un wrapper sur le SQL. L'exception est un INSERT qui récupère ses données à partir d'un autre sous-tableau, mais je ne pense pas que ce soit ce que vous voulez dire. Les instructions mettent à jour les lignes que vous spécifiez dans votre clause WHERE, qui peut être zéro, une ou plusieurs. Encore une fois, c'est ainsi que fonctionne SQL.

mais si je voulais appliquer une mise à jour chaque enregistrement du curseur, je ne peux voir comment faire individuellement, en utilisant contentValues ​​et mise à jour(), puis le curseur nécessite rechargeant ??

Si le changement est le même, utiliser une seule instruction UPDATE et la clause WHERE appropriée (soit par la méthode update(), si cela correspond à votre modèle de mise à jour, ou via execSQL()). Vous devez requery() le Cursor car le Cursor contient le jeu de résultats de la requête précédente, avant vos modifications. Puis-je ne pas créer une insertion List et bulk ?

Vous êtes invités à écrire du code Java qui fait ce que vous voulez. Cependant, votre contrainte est SQL/SQLite.