Как настроить nspredicate и nsentitydescription в coredata, чтобы сделать сложный запрос SQL

StackOverflow https://stackoverflow.com/questions/2241980

Вопрос

Я знаю, как создать nspredicate, чтобы сделать SQL "SELECT * FROM DRINK". Анкет Но как насчет этого запроса:

"SELECT I.name, D_I.amount 
FROM DRINK_INGREDIENT D_I, DRINK, INGREDIENT I 
WHERE D_I.drinkID=1 AND DRINK.drinkID=1 AND I.ingredientID = D_I.ingredientID;"  

Как мне даже установить nsentitydescription и nspredicate для такого рода запроса?

Это было полезно?

Решение

Как правило, с основными данными вы разработаете и используете модель данных, которая отвечает вашим потребностям. Вы не должны думать об этом с точки зрения SQL-он даже не должен использовать SQL для хранения-не если вы пытаетесь напрямую перевести SQL-запрос в запрос выбора с предикатом и т. Д.

Тем не менее, иногда может быть полезно думать с точки зрения SQL, где положения при строительстве предикатов, но на самом деле запросы сводятся к тому, какую организацию вам нужно получить, и как коллекция должна быть отфильтрована и/или отсортирована и т. Д.

Запросы на выборку ограничены одним объектом, поэтому я думаю, что вам понадобятся несколько запросов на выборку для моделирования вашего запроса.

Как выглядит ваша модель основных данных данных? Что вы пытаетесь достичь? что ты уже испробовал?

ОБНОВИТЬ
Похоже, ваша модель данных включает в себя две сущности: напиток и ингредиент с различными отношениями между ними:

Выпить <<->> ингредиент

Обратите внимание, что в основных данных нет сущности для питья, если вы явно его не создаете (есть дополнительная таблица для отношений для многих ко многим, но она абстрагирована от вас). Поскольку вам нужна значение суммы, связанное с строками в дополнительной таблице, я бы порекомендовал добавить объект питьевого риска в основные данные:

Пить <->> питье

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

Похоже, вы хотите получить имя и количество для списка ингредиентов для конкретного напитка. Для этого просто принесите объекты питья с предикатом фильтра, подобным этому:

// assuming "aDrink" is a reference to a particular Drink object
// and "drink" is the relationship from DrinkIngredient to Drink
fetchRequest.predicate = [NSPredicate predicateWithFormat:@"drink == %@",aDrink];

// if the fetch request result array is named "ingredientList"
// and the relationship from DrinkIngredient to Ingredient is "ingredient"
for (DrinkIngredient *di in ingredientList) {
    NSString *ingredientName = di.ingredient.name;
    NSUInteger amount = di.amount.integerValue;

    // use "ingredientName" and "amount" here
}

Поскольку вы используете основные данные, а не SQL, вы делаете вещи по -другому. Например, если вы хотите отобразить список ингредиентов с именем и количеством для всех напитков, вы просто принесете все объекты напитков (без предиката фильтра), и вы получаете доступ к ингредиентам через отношения от напитка до питья.

Опять же, вы должны подумать о том, что вы пытаетесь выполнить, и разработать и использовать свою модель данных надлежащим образом. Вы не должны думать о SQL или запросах.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top