#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) в зависимости от скорости использования приложения после первой выборки