Во-первых, рассмотрите возможность вызова '[appDelegate readSalesFromDatabase]' для viewDidLoad или в методе init вашего контроллера представления, поскольку вы вызываете это для каждой представленной строки. Это, вероятно, не то, что вы хотите для производительности.
Во-вторых, вы должны проверить, что находится в массиве 'sales', и убедиться, что в нем есть данные. Если значение indexPath.row превышает размер массива, вероятно, вы не возвращаете фактическое и правильное количество строк в tableView: numberOfRowsInSection: '. В этом случае у вас запрашивают данные, которые могут отсутствовать в вашем резервном хранилище.
Кроме того, вам может потребоваться использовать UITableView не как «назначение данных в ячейку таблицы», а как «возврат данных для конкретной ячейки, которая отображается в данный момент».