Android
245 / 242 / 52
Регистрация: 19.01.2013
Сообщений: 1,896
Записей в блоге: 3
1

Запись в базу данных из разных потоков

15.06.2018, 20:32. Показов 833. Ответов 3
Метки нет (Все метки)

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

Так вот, у нас в приложении в базу пишет и аквтивити(при каких то действиях пользователя) и ресивиры и сервисы..
Например вызывая
Java
1
new SqlHelper().addItem(item);
Как и ожидаемо иногда вываливается ошибка о том что база блокирована(т.к. там уже идет запись или база уже открыта для записи и нельзя получить getWritableDatabase).
Как сделать так чтобы была какая то очередь на запись? или может есть другой способ для "мульти записи" из коробки?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.06.2018, 20:32
Ответы с готовыми решениями:

Чтение и запись в переменную с разных потоков
День добрый! Есть переменная и ведется в нее запись с потока 2,который является не потоком формы....

Запись и чтение xml из разных потоков
В общем проблема такая. В процедуре создается поток загрузки файла. В этом потоке, после удачной...

Построчная запись в txt файл из разных потоков
Есть 4 потока (threads), мне нужно данные от них записать в тхт файл(построчно). Как это сделать ?...

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

3
+1
344 / 177 / 53
Регистрация: 24.08.2010
Сообщений: 1,028
16.06.2018, 18:35 2
Java
1
2
while(база заблокирована)
thread.sleep(100)
мож так?
1
1542 / 1146 / 420
Регистрация: 08.05.2012
Сообщений: 5,137
16.06.2018, 20:33 3
Предположим, ситуация оправдана и по-другому нельзя, я бы в первую очередь рассмотрел вариант сваливать всю инфу в какой-нибудь пул или кэш, в одно место и оттуда писать в базу периодически. Вообще, никто не дёргает базу туда сюда настолько часто, что она может быть заблокирована. Возможно, я ошибаюсь, но мне кажется вариант с кешем самый оптимальный.
+1, хрень получится.
1
314 / 257 / 81
Регистрация: 31.10.2016
Сообщений: 619
18.06.2018, 11:46 4
Цитата Сообщение от ILNAR_93 Посмотреть сообщение
new SqlHelper()
нет, у вас должен быть только один инстанс вашего SqlHelper. причем synchronized. пример
Java
1
2
3
4
5
6
7
    public static synchronized DatabaseHelper getInstance(Context applicationContext) {
        if (helper == null) {
            helper = new DatabaseHelper(applicationContext);
        }
 
        return helper;
    }

и второе - используете транзакции для записи/чтения в бд.
Запрос без возврата результата
Java
1
2
3
4
5
6
7
         db.beginTransaction();
         try {
           ...//ваш код записи
           db.setTransactionSuccessful();
         } finally {
           db.endTransaction();
         }
Запрос с результатами
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
    db.beginTransaction();
        try {
            final Cursor cursor = db.query(<your query>);
            try {
                final List<Item> result = new ArrayList<Item>(cursor.getCount());
                while (cursor.moveToNext()) {
                    //item from cursor
                    result.add(item);
                }
                db.setTransactionSuccessful();
                return result;
            } finally {
                cursor.close();
            }
        } finally {
            db.endTransaction();
        }
Тут небольшое описание, как работать с бд.
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.06.2018, 11:46
Помогаю со студенческими работами здесь

Использование данных из разных потоков
Привет всем! Возникла проблема с использованием данных из разных потоков в многопоточном...

Использование разных моделей и запись в Базу
Доброе утро ! Нужна помощь с записью данных в БД. Так как во &quot;Вьюшку&quot; нельзя передавать...

Как обьеденить 2 разных Базу данных?
Как обьеденить 2 разных Базу данных на одной и когда нажимали run то видеть ихх сразу? да и...

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

Запись данных из двух отдельных потоков в один файл
Как реализовать запись данных из двух отдельных потоков в один файл? Мне кажется что проще с...

Запись данных в базу данных mdb с использованием DataAdapter и DataSet
Попробовал сделать Update для таблицы контактов: private void Form1_Load(object sender,...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru