2013-04-12 3 views
4

Мне нужно вставить где-нибудь между 50 - 500 информацией контакта в базу данных. У меня есть 4 arraylists, которые содержат изображение, имя, номер, переменную bool соответственно.Вставьте данные в базу данных - Каков наилучший способ сделать это

Каждая строка данных состоит из комбинации всех 4-х арраистов и SNO. См. Изображение ниже.

enter image description here

Мой вопрос, скажем, у меня есть 500 контактов, которые я извлечь из списка контактов пользователя. Хорошо, что у меня есть функция, которая вставляет каждую строку за раз в таблицу и вызывает ее 500 раз? или есть другой способ? Средняя идея состояла бы в том, чтобы объединить всех арраистов вместе, передать их функции и получить там данные и повторить инструкцию insert 500 раз.

Что лучше с точки зрения производительности?

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

ИЛИ

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

Прежде всего, замените свои 4 ArrayLists на 1 ArrayList типа пользовательского класса. Вы можете создать запрос 'INSERT', чтобы вставить много строк: http://stackoverflow.com/questions/6889065/inserting-multiple-rows-in-mysql –

ответ

6

Вставка данных в базу данных - Что это лучший способ сделать это

Я предлагаю вам создать свой собственный объект, который будет представлять таблицу, где свойства объекта будет равна столбцам таблица, экв.

public class Contact { 

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

    //getters and setters 
} 

Теперь ваш подход звучит как «код спагетти». Нет необходимости иметь четыре ArrayLists, и этот дизайн неэффективен и правилен.

Теперь у вас будет один объект ArrayList для контакта с 500 детьми.

Что такое лучший способ вставить?

Конечно обернуть вставки в один TRANSACTION что ускорить ваши вставки быстро и то, что является основным вашим дилинг с базой данных становится гораздо более безопасным и тогда вам не нужно заботиться о возможности потери целостности базы данных.

Пример сделки (один метод из моего личного примера проекта):

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

Большое спасибо за ваш вклад. Принят ваш ответ, когда будет завершен период ожидания. –

+0

@ VamsiChalla приветствуется :) – Sajmon

0

Преобразование 4 массивов в один массив объектов делает код лучше. но вы можете создавать эти объекты, не делая этого так.

Подготовьте инструкцию sql с переменными привязки (? Или: vars), затем выполните оператор несколько раз в цикле, установив переменные связывания для каждой строки.

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

Если вы собираетесь вставить 500 записей в базе данных, вы должны использовать транзакция

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

Какова область действия транзакции? Должны ли все вставки терпеть неудачу, если один из них делает? –

+0

Так работает транзакция, если одна вставка не удалась, все вставки будут отменены. Или все выполнено успешно или ничего. – Mike

+0

Я знаю это, я спрашиваю вас, правильная ли это логика. Как связаны вставки? Я думаю, каждый из них независим. –

0

Как упоминалось ранее создать Ваш собственный класс для представления одной строки или использовать ContentValues class SQlite не предоставляет возможность вставлять много строк в один запрос, как в MySQL, но есть какой-то способ его использования. Вы можете прочитать here.

Если вы решили использовать метод, описанный в этой ссылке, лучше создать функцию для создания этого запроса и запустить его только один раз. В противном случае. Как уже упоминалось, вы можете использовать транзакцию для улучшения производительности многих вставок.

Смежные вопросы