условная выборка

#objective-c #core-data #fetch

#objective-c #ядро-данные #выборка

Вопрос:

У меня возникли проблемы с выборкой строки с определенными условиями.

У меня есть объект, который называется UserAccounts и который содержит четыре атрибута: userName , passWord , userFullName , userLevel .,,,,,,,,,,,.

Для входа в систему я должен получить, passWord который соответствует userName . Для этого у меня есть два текстовых поля, userNameTF и passWordTF . Я должен извлечь строку с сущностью (я использую SQL для сравнения моего запроса), которая соответствует userNameTF.stringValue , а затем проверить, равен ли passWord атрибут passWordTF.stringValue .

Прямо сейчас я могу брать массивы userName и passWord из моего основного хранилища данных отдельно, используя:

 NSArray *userName = [[userAccountsArray arrangedObjects] valueForKey:@"userName"];   
NSArray *passWord = [[userAccountsArray arrangedObjects] valueForKey:@"passWord"];
  

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

Я делал это раньше с помощью SQL в VisualStudio, используя: select "password" from userAccounts where userName = @"username" а затем сравнивая результат с введенным паролем, но я не могу найти способ извлечь строку с сущностью, чтобы что-то сделать с ее атрибутами.

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

1. Я не очень хорошо знаю core data, но, похоже, вы все делаете неправильно. Вы должны иметь возможность сохранять объект, у которого есть как имя пользователя, так и пароль, вместо того, чтобы хранить имена пользователей и пароли отдельно. Т.е. вы должны хранить массив пользователей, а не имена пользователей или пароли.

2. @Josh Caswell, Да, вы правы, моя проблема в том, как именно я могу сохранить массив, включающий 2 атрибута объекта. В любом случае, спасибо за ваш быстрый ответ и доработку.

3. @Prooshani: Не за что, но я всего лишь редактировал, а не отвечал. Вы хотите отправить сообщение @vakio, чтобы обсудить этот комментарий.

4. @Джош Касвелл, хех, да, ты прав, чувак.

5. @vakio, в любом случае, спасибо, чувак, что ответил на мой вопрос, и извини за мою ошибку.

Ответ №1:

Помните, что Core Data — это библиотека сохранения графа объектов; SQL абстрагирован от вас, и мышление в терминах SQL часто просто приводит к путанице.

Чтобы решить эту проблему, вы хотите создать запрос на выборку, используя предикат, который указывает имя пользователя. Если пользователь существует, он вернет массив с одним объектом user (предполагая здесь, что имена уникальны). Затем все, что вам нужно сделать, это сравнить строку вашего пароля со свойством password вашего объекта, управляемого пользователем, чтобы проверить, совпадают ли они или нет.

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

1. Я могу извлекать имена пользователей, и, конечно, они уникальны. Итак, вы собираетесь сказать мне, что мой результат выборки представляет собой массив, включающий все атрибуты (4 атрибута), и если имя пользователя уникально и доступно, то мой атрибут passWord присутствует (как свойство) для сравнения его с введенным паролем?

2. Вы извлекаете не массив атрибутов, вы извлекаете массив NSManagedObject (подклассов) длиной 1. У каждого объекта есть определенные вами атрибуты; имя пользователя, пароль и т.д. Помните, Core Data — это объектный граф, а не выбор строк из базы данных.

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

4. Как я уже сказал, установка предиката в вашем запросе на выборку — это правильный путь. Смотрите документы для получения исходного кода, который показывает, как это настроить.

Ответ №2:

Ну, наконец-то я снова нашел способ решить свою проблему!

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

 NSArray *userAccounts=[userAccountsArray arrangedObjects]; 
NSArray *matchingAccounts=[userAccounts  filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"%K == %@",@"userName",userNameTF.stringValue]];
NSString *matchedPassWords=[[matchingAccounts valueForKey:@"passWord"]objectAtIndex:0];
  

Итак, я могу найти пароль, связанный с именем пользователя, которое пользователь ввел в текстовое поле userNameTF !

В любом случае, это мой способ решить проблему, и я думаю, что есть и другие решения.

Спасибо вам всем.