2013-03-19 5 views
2

Итак, я прочитал все сообщения, которые я нашел в Интернете, но я все еще не могу сделать эту работу.EXC_BAD_ACCESS на dispatch_async при вставке данных в SQLite с FMDB

Я пытаюсь вставить огромное количество данных в базу данных sqlite. Это 20000 строк данных, поэтому я должен сделать это в фоновом потоке.

У меня есть NSObject .h и .m файлы для обработки операций с базой данных. И я вызываю их изнутри моего главного взгляда.

Вот мой код:

SQLiteDBHandler.m : 

database = [FMDatabase databaseWithPath:[self getDBPath]]; 
    [database open]; 
    dispatch_queue_t q = dispatch_queue_create("FMDBQueue", NULL); 
    dispatch_async(q, ^{ 
     for(Customer *c in arrayOfObjects) { 
      [database executeUpdate:@"INSERT INTO SNP(rdis, Position, FirstName, LastName) VALUES (?,?,?,?)", c.ID, c.Position, c.FirstName, c.LastName]; 
     } 
     [database close]; 
    }); 

и для вызова метода в главном окне, я называю это так:

SQLiteDBHandler *dbHandler = [[SQLiteDBHandler alloc]init]; 

[dbHandler insertDataIntoTable:mutableArray]; 

Я попытался изменить FMDatabase с FMDatabaseQueue не повезло , Поэтому любая помощь будет высоко оценена, потому что я довольно отчаянный в этом.

Спасибо. Ура!

+0

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

+0

Вы уже включили зомби? –

+0

@MrBonjour: Да, я думал о публикации изображения, но ошибка стека продолжает меняться от кода ошибки 1 до 2 и так далее. @ HermannKlecker: Да, я включил зомби, и ничего не вышло на консольный журнал. Это странно. – tyegah123

ответ

0

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

http://www.raywenderlich.com/2696/how-to-debug-memory-leaks-with-xcode-and-instruments-tutorial

Надежда, что помогает

EDIT:

В Xcode, панели инструментов в верхней части экрана Product-> Изменить схемное> Диагностика-> Нажмите «Включить объекты зомби»

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

Edit2:

Забыла сказать, шаблон зомби появится только если вы профилирование на тренажере, он не будет появляться, если вы попытаетесь профилирование на реальном устройстве

Edit3: Фото

enter image description here

Тогда вы должны увидеть это

enter image description here

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

enter image description here

Нажмите стрелку рядом с сообщением об ошибке, и он должен вы показываете в трассировке стека, где происходит ошибка

+0

ну, в первую очередь спасибо за ответ. Но я сожалею, если это может показаться глупым вопросом, но что такое зомби? и как это сделать? – tyegah123

+1

Зомби - это противоположность утечки памяти, в которой объект был выпущен, но он поддерживается живой ссылкой на него другим объектом, отсюда и зомби. См. Мои изменения о том, как включить его. – AdamM

+0

Хорошо спасибо. Я включил его, но ничего не вышло в моем консольном журнале. Интересно, почему. – tyegah123

1

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

  1. Thread 1 открывает соединение с базой данных
  2. резьба 2 открывает соединение с базой данных
  3. Thread 1 добавляет блок в очереди
  4. Тема 2 добавляет блок в очереди
  5. резьбы 1 отделки работает и закрывает соединение db
  6. Резьба 2 пытается запустить свой блок, но соединение db уже закрыто.

Попробуйте позвонить [database open] внутри блока.

+0

, который звучит хорошо для меня –

+0

@Eli Ganem, как мы можем избежать этой ситуации? спасибо за Ваш ответ – RamGrg

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