Множественный доступ к базе данных sqlite с использованием sqlite swift iOS

Вот мой сценарий,

У меня есть несколько запросов, когда я вхожу в свое приложение, и в одном из его ответов содержится более 10 000 записей.

Я использую SQLite.swift в своем проекте.

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

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

Я пытался использовать несколько подключений для вставки в БД, но если другое подключение использует БД, то оно заблокировано и приложение вылетает.

фатальная ошибка: "попробуй!" выражение неожиданно вызвало ошибку: база данных заблокирована: файл /Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang-703.0.18.1/src/swift/stdlib/public/core/ErrorType.swift, строка 54

try DataManager.con.transaction {

            for index in 0 ... (entity.count - 1) {
            try DataManager.con.run(table.insert(
                    Latitude <- entity[index]["Latitude"].string,
                    Longitude <- entity[index]["Longitude"].string
                ))
            }
        }

Здесь DataManager.con — одноэлементный объект.

Пожалуйста помоги.


person vinbhai4u    schedule 23.07.2016    source источник
comment
Выполняйте транзакции базы данных в фоновом потоке или любых других потоках, кроме main thread.   -  person Santosh    schedule 23.07.2016
comment
@Santosh Я делаю то же самое, массовая вставка выполняется в фоновом потоке, так как я использую объект singleton db, когда пытаюсь получить доступ к другой таблице, он зависает   -  person vinbhai4u    schedule 23.07.2016
comment
Может быть несколько причин, и вы не предоставили соответствующую информацию, например, журналы CoreData.SQLDebug, уязвимый блок кода и т. д.   -  person Khundragpan    schedule 23.07.2016
comment
@K.Nimo Я не использую CoreData, просто использую Стивена Селиса sqlite.swift   -  person vinbhai4u    schedule 23.07.2016
comment
Если вы поместите соответствующий код/журналы сбоев, это будет полезно для отладки.   -  person Santosh    schedule 23.07.2016
comment
@Santosh Я добавил журнал сбоев. Я добавлю фрагменты кода, которые я использую сейчас. Надеюсь это поможет   -  person vinbhai4u    schedule 23.07.2016
comment
База данных заблокирована — это ошибка параллелизма, которую должен предотвратить SQLite.swift: вы должны открыть проблему в их репозитории Github. А пока внимательно прочитайте среду. com/@gwendal.roue/   -  person Gwendal Roué    schedule 25.07.2016
comment
@GwendalRoué Я решил эту проблему, переместив пару таблиц в другую базу данных, например таблицы основных данных. для доступа к этому я использовал другое соединение с базой данных, которое не блокирует мой основной поток   -  person vinbhai4u    schedule 25.07.2016
comment
Отлично @vinbhai4u! Я по-прежнему считаю, что вам следует предупредить авторов библиотек о вашей проблеме, чтобы они знали об этом.   -  person Gwendal Roué    schedule 25.07.2016
comment
Массовый запрос, который вы можете обработать с помощью FMDB github.com/ccgus/fmdb Пример настройки здесь github.com/hasyapanchasara/SQLite_SingleManagerClass   -  person Hasya    schedule 17.03.2017
comment
Sqlite.swift утверждает, что является потокобезопасным, так почему же это происходит?   -  person Paul    schedule 29.11.2017
comment
@Gwendal Roué Спасибо за ссылку. Я использовал разные очереди для загрузки в своем приложении и получал ту же ошибку. поэтому я создал последовательную очередь для всех вставок с транзакциями, и это решило проблему.   -  person iUser    schedule 20.09.2018


Ответы (1)


С sqlite.swift невозможно было создавать одновременные соединения.

Поэтому я переместил свои основные данные в другую базу данных и создал для нее отдельное соединение.

я также добавил

do{
// Start transaction
// code
// Commit transaction
}
catch {
}

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

Спасибо всем, кто помог.

person vinbhai4u    schedule 25.07.2016