структура массивов при загрузке данных в iphone

#iphone #model-view-controller #ios4 #nsmutablearray

#iPhone #model-view-controller #ios4 #nsmutablearray

Вопрос:

я занимаюсь программированием для iphone уже пару недель, и мне удалось создать свою первую базу данных, управляемую sqlite.

для моего первого базового приложения у меня есть 2 таблицы (с отношением «один-много»): бренды, продукты

 brands (code, brandname)
products (code, brandcode, productname, price, ...)
  

что касается моего примера данных:

 * brands:
1 apple
2 hp
*products:
1 1 Macbookpro
2 1 iphone
3 1 ipad2
4 2 hpnotebook
  

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

сначала я создал 2 nsmutablearrays в делегате приложения, которые я загружаю во время выполнения didFinishLaunchingWithOptions.

однако нет способа узнать данные в ячейке для функции cellForRowAtIndexPath при загрузке второго tableview, потому что в моем массиве продуктов есть они все .. и я бы не знал, какой второй продукт соответствует критериям brandcode = 1

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

с точки зрения производительности: было ли то, что я сделал, правильным? или есть какие-либо лучшие способы фильтрации моей таблицы продуктов.

я ценю вашу помощь и время

приветствия,

Комментарии:

1. Вы упомянули, что это проект SQLite. Используете ли вы CoreData для доступа или другую библиотеку SQL? В любом случае, вы можете сделать запрос на основе загружаемой вами таблицы: «ВЫБЕРИТЕ название ИЗ брендов», а затем «ВЫБЕРИТЕ название ИЗ продуктов, ГДЕ brand = ‘Тот, который только что выбрал пользователь». (Это псевдокод для описания моей точки зрения, если это похоже на то, о чем вы хотите получить дополнительную информацию, я могу уточнить это и опубликовать в качестве ответа.)

Ответ №1:

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

Когда пользователь нажимает ( tableView:didSelectRowAtIndexPath ) на бренд в первом представлении таблицы, сделайте что-то вроде этого:

 MyTableView *tableView = [[MyTableView alloc] init];
tableView.myNSMutableArrayforABrand = arrayWithProductData;
[self.view addSubview:tableView]
[tableView release];
  

Таким образом, вы присоединяете данные из первого табличного представления ко второму.

Комментарии:

1. привет, Джерун, спасибо за быстрый ответ… и, честно говоря.. хороший фрагмент кода. но мой проект уже функционирует должным образом, я просто хочу знать, является ли хорошей практикой помещение массива продуктов в класс бренда…

2. На самом деле лучше всего поддерживать слабую связь, особенно при рассмотрении недостатков ( en.wikipedia.org/wiki/Coupling_ (computer_science)#Недостатки ). Чтобы достичь этого, вы в конечном итоге создали бы один класс для продукта, один для бренда и другой класс коллекции, который сохранял бы взаимосвязь отсортированных в соответствующей структуре данных. С другой стороны, это занимает больше времени, и хороший программист должен выбрать подходящее количество времени (в зависимости от сложности, размера проекта), чтобы потратить на эти вещи. Лучший 🙂 !

3. Также, если я ответил на ваши вопросы, пожалуйста, рассмотрите возможность проверки правильности этого.

Ответ №2:

Я бы создал два класса (бренд и продукт). Класс Brand содержит MutArray с экземплярами продукта. ViewController или AppDelegate содержит множество брендов. Вы должны передать информацию из первого TableView во второй tableview.

У вас есть две возможности:

1: Щелкнув по бренду, tableView:didSelectRowAtIndexPath: вы получаете выбранный объект, используя: product = [brands objectAtIndex:indexPath.row] и передаете этот продукт второму ViewController (например, через новый initWithProduct: ), который затем представляет данные этого продукта.

2: При нажатии на бренд: передайте только индекс / PrimaryKey этого бренда, и второй ViewController извлекает все продукты этого ключа из самой базы данных.

Комментарии:

1. эй, Томас, я уже сделал проект, и он работает! я уже использовал первый сценарий, который вы предложили. и я действительно подумал о втором сценарии (второй контроллер представления будет извлекать данные из самой базы данных …) — мой вопрос: это лучший способ сделать это?? или лучший подход — извлечь его из базы данных?

2. это зависит. Если ваша база данных является огромным монстром (по размеру данных), тогда будет лучше извлекать только те данные, которые вам нужны (подход 2), в соответствии с потребностями в памяти. Если ваша база данных относительно невелика (несколько МБ), то будет лучше сначала извлечь все данные (подход 1) в зависимости от скорости использования приложения после первой выборки