2016-03-23 6 views
0

Вот что я хочу делать. Я хочу загрузить данные из базы данных нашего сайта и сохранить их в sqlite. Мы делаем это, чтобы иметь автономную версию приложения. Это просто просмотр, поэтому нет методов обновления и удаления.Android json вставить в sqlite со слишком большим количеством данных

Я пытаюсь вставить json в Android Sqlite с небольшим количеством данных, и это успешно. Но здесь возникает проблема, когда я пытаюсь сделать это с более длинными данными. Мне нужно вставить около 19 000 строк в таблицу. Я использую ProgressDialog, который работает на UiThread, чтобы дать пользователю представление о прогрессе

Progress dialog sample

Класс делает хорошо, но при вставке, что много данных занимает много времени и андроид выдает ошибку. Иногда возникает ошибка «Слишком долго, чтобы ответить:« Подождите или отмените ». Иногда, как это ...

Unfortunately, the App had stopped

Но App не прекращались на самом деле, потому что в журналах я вижу, что он все еще вставляя к столу. Android дает эту ошибку, я думаю, что она не признала, что я все еще вставляю, или я не знаю, какая проблема. Вставка в журналах прекращается, когда я нажимаю OK в диалоговом окне ошибки.

ui.setting.UserSettingsActivity: insertEquipmentProfile: 16494 
ui.setting.UserSettingsActivity: insertEquipmentProfile: 16495 
ui.setting.UserSettingsActivity: insertEquipmentProfile: 16496 

Тогда после этого, он записывает это виды ошибок:

E/SQLiteLog: (5) database is locked 
E/SQLiteDatabase: Failed to open database '/data/data/com.name.android.name/databases/name_android_offline.db'. 
               android.database.sqlite.SQLiteDatabaseLockedException: database is locked (code 5): , while compiling: PRAGMA journal_mode 

что я должен делать? Я не уверен, что этот журнал имеет значение, но я добавлю это, как тайм-аут, но я не знаю.

W/ActivityManager: Activity pause timeout for ActivityRecord{f2e77e1 u0 ui.setting.UserSettingsActivity t762 f} 

Я также попытался добавить Транзакции в мои вспомогательные методы базы данных, но это не помогло.

database.beginTransaction(); 
database.setTransactionSuccessful();  
database.endTransaction(); 

Есть ли способ вставить слишком много строк в стол? Я не уверен, какие данные я вам дам, чтобы позволить мне объяснить мою проблему, но я ищу способы не разбивать приложение, вставляя слишком много данных, потому что мой код отлично работает при вставке 4000 строк.

+0

Вы вставляете в основной поток? Является ли он синхронным/многопоточным? –

ответ

2

Я предполагаю, что вы выполняете все операции с базой данных в основном потоке, что приводит к диалогу «Приложение не реагирует» (ANR). Так что вам нужно выполнить эти операции в фоновом потоке. Посмотрите на такие вещи, как AsyncTask, Handlers, (Intent) Service, RxJava (с планировщиками) или ваше собственное решение для потоковой обработки/планирования.

+0

Вы можете найти официальную документацию, описывающую это в [Процессы и потоки] (http://developer.android.com/guide/components/processes-and-threads.html#Threads). В частности, см. Параграф 4 раздела _Threads_: «В частности, если все происходит в потоке пользовательского интерфейса, выполнение длительных операций, таких как запрос доступа к сети или базы данных, блокирует весь пользовательский интерфейс ... Если поток пользовательского интерфейса заблокирован более чем несколько секунд (около 5 секунд в настоящее время) пользователю предоставляется печально известное диалоговое окно «приложение не отвечает» (ANR) ». –

-1

Используйте Retrofit для получения данных и конвертирования в POJO и greenDao для вставки в базу данных.

dao.insertOrReplaceInTx(pojoArray[]); 
Смежные вопросы