2013-04-12 8 views
4

Je dois insérer n'importe où entre 50 - 500 informations de contact dans la base de données. J'ai 4 arraylists qui contiennent l'image, le nom, le nombre, la variable bool respectivement.Insérer des données dans la base de données - Quelle est la meilleure façon de le faire

Chaque rangée dans les données est composée d'une combinaison de tous les 4 arraylists avec un SNO. S'il vous plaît se référer à l'image ci-dessous.

enter image description here

Ma question est, disons que j'ai 500 contacts que je récupérer à partir de la liste de contacts de l'utilisateur. Est-ce une bonne chose que j'ai une fonction qui insère chaque rangée à la fois dans la table et l'appelle 500 fois? ou y a-t-il un autre moyen? Une idée moyenne serait de combiner tous les arraylists ensemble, le passer à la fonction et récupérer les données là-bas et répéter l'instruction d'insertion 500 fois.

Quoi de mieux en termes de performances?

for(int i =0; i < 500; i++) 
{ 
    dbObj.insert_row(par1, par2, par3, par4, ...); 
} 

OU

function insert_row(Combined ArrayLists) 
{ 
    for(int i=0; i<500; i++) 
    { 
    db.execSql(//Insert Statement); 
    } 
} 
+2

Tout d'abord, remplacez vos 4 ArrayLists par 1 ArrayList d'un type de classe personnalisé. Vous pouvez créer une requête 'INSERT' pour insérer plusieurs lignes: http://stackoverflow.com/questions/6889065/inserting-multiple-rows-in-mysql –

Répondre

6

Insérez des données dans la base de données - Quelle est la meilleure façon de le faire

Je vous propose de créer votre propre objet qui représentera votre table où les propriétés d'objets seront égaux aux colonnes table, éq

public class Contact { 

    private String name; 
    private String number; 
    private String image; 
    private boolean conn; 

    //getters and setters 
} 

Maintenant votre approche ressemble à du "code spaghetti". Il n'est pas nécessaire d'avoir quatre ArrayLists et cette conception n'est pas efficace et correcte.

Maintenant, vous aurez une ArrayList d'objet contact avec 500 enfants.

Quelle est la meilleure façon d'insérer?

Pour envelopper que votre insertion à une TRANSACTION qui accélèrent vos inserts rapidement et ce qui est la principale base de données de votre GÉRER devient beaucoup plus sûr et vous n'avez pas besoin de se soucier de la possibilité de perdre l'intégrité de la base de données.

Exemple de transaction (une méthode de mon exemple de projet personnel):

public boolean insertTransaction(int count) throws SQLException { 
    boolean result = false; 
    try { 
     db = openWrite(DataSource.getInstance(mContext)); 
     ContentValues values = new ContentValues(); 
     if (db != null) { 
      db.beginTransaction(); 
      for (int i = 0; i < count; i++) { 
       values.put(SQLConstants.KEY_TYPE, "type" + i); 
       values.put(SQLConstants.KEY_DATE, new Date().toString()); 
       db.insertOrThrow(SQLConstants.TEST_TABLE_NAME, SQLConstants.KEY_TYPE, values); 
       values.clear(); 
      } 
      db.setTransactionSuccessful(); 
      result = true; 
     } 
     return result; 
    } 
    finally { 
     if (db != null) { 
      db.endTransaction(); 
     } 
     close(db); 
    } 
} 
+1

Merci beaucoup pour votre contribution. Acceptera votre réponse lorsque la période d'attente est terminée .. –

+0

@VamsiChalla vous êtes les bienvenus :) – Sajmon

0

Conversion de 4 rangées dans une matrice d'objets rend le code mieux. mais vous pouvez créer ces objets sans le faire comme ça.

Préparez l'instruction sql avec des variables de liaison (? Ou: vars), puis exécutez l'instruction plusieurs fois dans une boucle en définissant les variables de liaison pour chaque ligne.

String sql = "insert into..... values (?,?,?,?)"; 
// Get connection etc 
PreparedStatement stmt = conn.prepareStatement(sql); 
for(int i =0; i < 500; i++) 
{ 
    stmt.setString(1, name.get(i)); 
    stmt.setNumber(2, number.get(i)); 
    ... 

    stmt.executeUpdate(); 
} 
0

Si vous allez insérer 500 enregistrements dans la base de données, vous devez utiliser la transaction

database.beginTransaction(); 
try { 
    // perform inserts 
    database.setTransactionSuccessful(); 
finally { 
    database.endTranasction(); 
} 
+0

Quelle est la portée de la transaction? Est-ce que toutes les insertions doivent échouer si un seul fait? –

+0

Voici comment fonctionne la transaction, si une insertion échoue, toutes les insertions seront annulées. Ou tout est réalisé avec succès ou rien. – Mike

+0

Je le sais, je vous demande si c'est la bonne logique. Comment les inserts sont-ils liés? Je pense que chacun est indépendant. –

0

Comme mentionné précédemment créer votre propre classe pour représenter une ligne ou utiliser ContentValues class SQlite n'offre pas la possibilité d'insérer plusieurs lignes dans une requête comme dans MySQL mais il y a un moyen de contourner le problème. Vous pouvez lire here.

Si vous décidez d'utiliser la méthode décrite dans ce lien, il est préférable de créer une fonction pour générer cette requête et de l'exécuter une seule fois. Sinon Comme d'autres l'ont déjà mentionné, vous pouvez utiliser la transaction pour améliorer la performance de nombreux inserts.

Questions connexes