Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/13: Рейтинг темы: голосов - 13, средняя оценка - 5.00
 Аватар для semiromid
7 / 7 / 2
Регистрация: 28.08.2014
Сообщений: 179

AsyncTask и SQLite

08.04.2015, 14:57. Показов 2613. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! У меня в приложении есть БД SQLite, при нажатие на кнопку загрузки, приложение начинает в базу вносить записи.
Структура базы :
1.таблица-одна, колонка - одна
2.Кол-во записей : 20 000
3.Формат записи: String до 10 символов.

Метод добавления : через бэкграунд, фоновый поток, используя наследования класса "AsyncTask"


Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
class MyTask extends AsyncTask<Void, Integer, Void> {
    
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            Info.setText("Начали ");
        }
 
        @Override
        protected Void doInBackground(Void... params) {
            int counter = 0;
            try {           
                for(int i=0; i<20000;i++){      
                                getFloor(counter);
                    publishProgress(++counter);
                    }   
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            return null;
        }
 
        @Override
        protected void onProgressUpdate(Integer... values) {
            super.onProgressUpdate(values);
            Info.setText("Позиция : " + values[0]);
            horizontalprogress.setProgress(values[0]);
        }
        
        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
            Info.setText("Загрузили"); 
        }
        
        
        private void getFloor(int floor) throws InterruptedException {
               // Метод 1: INSERT через класс CONTENTVALUE
                   ContentValues cv = new ContentValues();
                   cv.put("time", "Hello "+floor);
                  // вызываем метод вставки
                  Asqdb1.insert("alarm_table",null, cv);
        }
        
        
    }
При занесения записей в базу, уходит около 10-20 минут. Подскажите пожалуйста, нормальная ли это ситуация, когда так долго происходит добавления записей в БД?
Я понимаю что в фоновом потоке задачи выполняются медленнее. Но всё таки, мне кажется что то слишком долго.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.04.2015, 14:57
Ответы с готовыми решениями:

Как написать формулы в sqlite или отказаться от использования sqlite вовсе
Доброго времени суток. Друзья, пишу справочник по физике, недавно столкнулся с проблемой - как написать формулы в sqlite? пользуюсь DB...

Файл cookies.sqlite не sqlite на самом деле, или как его открыть
хочу прочитать куки браузеров (это не противозаконно) оперу сделал, хром сделал, у хрома как раз sqlite как и у мозилы делаю...

SQLite for Excel или как выгрузить данные в SQLite
Здравствуйте! Мне необходимо написать макрос для выгрузки данных из excel в sqlite. Нашла проект SQLite for Excel, но при запуске...

11
2884 / 2296 / 769
Регистрация: 12.05.2014
Сообщений: 7,978
08.04.2015, 15:01
Лучший ответ Сообщение было отмечено semiromid как решение

Решение

я бы добавлял не по 1 записи, а по 100 например
и прогресс тоже обновлял не после каждой записи
1
400 / 343 / 85
Регистрация: 17.10.2014
Сообщений: 1,015
08.04.2015, 16:08
Лучший ответ Сообщение было отмечено semiromid как решение

Решение

semiromid,
Цитата Сообщение от semiromid Посмотреть сообщение
ContentValues cv = new ContentValues();
мб не надо 20000 раз создавать новый, хватит и одного экземпляра.
1
426 / 406 / 68
Регистрация: 06.10.2012
Сообщений: 1,748
08.04.2015, 16:18
Лучший ответ Сообщение было отмечено semiromid как решение

Решение

semiromid, товарищ, это архинеправильно.
Во-первых, непонятен смысл переменной counter, если есть i.
Во-вторых, пользователь не увидит общее количество записей, только лишь текущую. Соответственно, непонятно, как вы будете выводить процент выполнения.
В-третьих, как уже правильно сообщили, вставка по одной записи годится разве что для 10 записей. В противном случае надо читать мануалы. Требуется использовать транзакции и вставлять циклом все записи.
1
 Аватар для Netscape
374 / 361 / 52
Регистрация: 02.10.2009
Сообщений: 712
Записей в блоге: 4
08.04.2015, 17:33
Лучший ответ Сообщение было отмечено semiromid как решение

Решение

Самая примитивная оптимизация InsertHelper + Transaction

http://schleicher.ru/blog/583.html
1
 Аватар для semiromid
7 / 7 / 2
Регистрация: 28.08.2014
Сообщений: 179
09.04.2015, 01:38  [ТС]
Паблито,

я бы добавлял не по 1 записи, а по 100 например
и прогресс тоже обновлял не после каждой записи
А как?
Нужно некий пул создавать?

Добавлено через 1 час 25 минут
CoolMind,
publishProgress(++counter); - выводит процент выполнения

В-третьих, как уже правильно сообщили, вставка по одной записи годится разве что для 10 записей. В противном случае надо читать мануалы. Требуется использовать транзакции и вставлять циклом все записи.
Циклом вставлять записи? - for цикл медленный ( Нужно что то другое
Может лучше вставлять кусками типо так:

Java
1
2
3
4
5
6
7
8
9
10
11
12
13
                  cv.put("time", "Hello "+floor);
                  // вызываем метод вставки
                  Asqdb1.insert("alarm_table",null, cv);
 
                  cv.put("time", "Hello "+floor);
                  // вызываем метод вставки
                  Asqdb1.insert("alarm_table",null, cv);
 
                  cv.put("time", "Hello "+floor);
                  // вызываем метод вставки
                  Asqdb1.insert("alarm_table",null, cv);
 
                //и.т.д  до 100 например
Нормально так будет?
Что то мне подсказывает что, нет( А как лучше тогда?

Спасибо.
0
426 / 406 / 68
Регистрация: 06.10.2012
Сообщений: 1,748
09.04.2015, 11:00
semiromid, пожалуйста.
Почитайте, например, здесь: http://habrahabr.ru/post/205620/ и внутри тоже пройдите по ссылке.

Добавлено через 3 минуты
Netscape предлагает тоже хороший вариант, там правильно указано про блок finally при завершении транзакции. Некоторые программисты про него забывают.
1
 Аватар для semiromid
7 / 7 / 2
Регистрация: 28.08.2014
Сообщений: 179
09.04.2015, 13:24  [ТС]
CoolMind,
Спасибо за ссылки.
Но я уже реализовал все, работает в десятки раз быстрее. Было 15-20 минут загрузки, стало 13 секунд.

Мне бы еще хотелось бы услышать ответ на мой вопрос.

Циклом вставлять записи? - for цикл медленный ( Нужно что то другое
Может лучше вставлять кусками типо так:
cv.put("time", "Hello "+floor);
// вызываем метод вставки
Asqdb1.insert("alarm_table",null, cv);

cv.put("time", "Hello "+floor);
// вызываем метод вставки
Asqdb1.insert("alarm_table",null, cv);

cv.put("time", "Hello "+floor);
// вызываем метод вставки
Asqdb1.insert("alarm_table",null, cv);

//и.т.д до 100 например
Нормально так будет?
Что то мне подсказывает что, нет( А как лучше тогда?

Спасибо.
0
426 / 406 / 68
Регистрация: 06.10.2012
Сообщений: 1,748
09.04.2015, 13:48
semiromid, пожалуйста.
Если вы реализовали, то зачем вам ответ на этот вопрос? Кстати, вопрос-то в чём? В медленности цикла for? Нет, он такое же, как и любые другие циклы. Разве что foreach быстрее. Заменять for на куски кода, делающие то же самое, но без for, бессмысленно и даже вредно.
1
 Аватар для semiromid
7 / 7 / 2
Регистрация: 28.08.2014
Сообщений: 179
09.04.2015, 14:06  [ТС]
CoolMind,
Спасибо.

Но мне хотелось бы знать, как вставлять в базу данных информацию неким объемом за один раз.
Или как правильно вставлять информацию, таким способом.
Правильно ли я в примере показываю как её вставлять, или нет?

Добавлено через 9 минут
CoolMind,
Может быть другими словами, как вставить 100 записей в одну и ту же колонку БД, одним insert?
0
426 / 406 / 68
Регистрация: 06.10.2012
Сообщений: 1,748
09.04.2015, 15:41
semiromid, насколько я знаю, SQL-запросы позволяют вставку либо по одной записи за раз, либо вставку данных из запроса (множество за раз). Запросом обычно вытягиваются данные из существующих таблиц. Таким образом, если данные для БД являются новыми (не извлекаются из другой таблицы этой же БД), другого способа не придумать.
1
75 / 75 / 7
Регистрация: 29.03.2012
Сообщений: 256
10.04.2015, 01:43
советую почитать про sql очень внимательно и вдумчиво.

Insert - это вставка одной строки в таблицу,
для закрепления изменений используется commit

Ты можешь сделать 10 раз insert, и 1 раз закрепить все одним commit'ом. Надеюсь смысл ты понял.

При том в больших вставках - это рекомендуемое решение. Например при вставке 20000 делать коммит после 5000 записей
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.04.2015, 01:43
Помогаю со студенческими работами здесь

Sqlite в c++ под linux, как правильно подключить sqlite?
Добрый день. Подскажите пожалуйста, как подключить sqlite к c++? Пишу приложение без сред разработки. в миднайте. есть .cpp файл, .h...

Редактирование связанных объектов через EF в SQLite, C#, EF 6.2, SQLite, C# Winforms
Здравствуйте. Суть: используя вышеперечисленные технологии, при чтении из базы данных связанных объектов после добавления, функция...

SQLite не найден SQLite.Interop,dll
работаю на виртуальной машине windows 7 x86. Установлен Visual Studio 2013. Через NuGet установил для своего проекта...

AsyncTask
Здавствуйте! У меня такой вопрос как вытащить переменную из AsyncTask в основной поток. public class MainActivity extends Activity {...

AsyncTask
Здравствуйте, при использовании двух одинаковых методов получается разный результат. AsyncTask в одном случае успешно передает данные в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru