Необходимость сохранения данных в устройстве является очень распространенным требованием для любого мобильного приложения. Это позволит пользователям получать доступ к приложению в автономном режиме, а также поможет быстрее получить доступ к данным.
Есть много способов, с помощью которых мы можем сохранить данные в устройстве. Одним из лучших способов является использование основной базы данных для хранения данных на устройстве.
Создайте новое приложение «DBExampleApp» с выбранной опцией «Использовать основные данные».
Мы будем использовать тот же пример «Статьи» из нашего предыдущего урока . Мы изменим пример и сохраним статьи в базе данных, получим статьи из базы данных и покажем их в списке.
Вы найдете ссылку для загрузки полного исходного кода в конце этого урока.
Что мы ждем?
За исключением файлов Appdelegate, добавьте все файлы из предыдущего примера в новый проект. Не забудьте удалить все строки, кроме оператора return в методе appDidLaunch. Также добавьте свойство «Основное имя файла основной раскадровки» в файл «DBSampleApp-info.plist».
Начальные настройки сделаны. Запустите приложение, чтобы убедиться, что все работает отлично.
Мы найдем дополнительные переменные и методы в файлах appdelegate. Эти дополнительные коды генерируются автоматически, если мы создаем приложение с включенной опцией «Использовать основные данные».
Файл модели данных «DBSampleApp.xcdatamodeld» также создается автоматически.
Знание определенной терминологии основных данных является обязательным для понимания методов и переменных в файлах приложения.
Хранилище постоянных объектов : Относится к способу сохранения объекта. Хранилище постоянных объектов может быть базой данных sqlite, XML, файлом и т. Д. Базовым хранилищем постоянных объектов в основной базе данных является база данных sqlite.
Модель управляемых объектов : представляет схему базы данных. Он содержит объекты или таблицы в базе данных, их атрибуты или поля и их связь друг с другом. Файл модели данных «DBSampleApp.xcdatamodeld» представляет модель управляемого объекта.
Описание сущности : в нашем примере «Article» является сущностью. Название и описание статьи обозначает описание сущности.
Управляемый объект : Экземпляры объекта представляют управляемый объект.
Контекст управляемого объекта : он позволяет нам изменять и управлять объектами в базе данных. Он упоминается как блокнот, поскольку он поддерживает историю отмен / повторов базы данных. Такие операции, как вставка, поиск и удаление объектов в базе данных, выполняются с помощью контекста управляемого объекта.
Координатор постоянного хранилища : он координирует постоянное хранилище и управляемые объекты приложения.
Поняв концепции базы данных, теперь попробуйте понять методы и переменные в файлах приложения.
Выберите файл «DBSampleApp.xcdatamodeld» и создайте новый объект «Article». Добавьте поля заголовка и описания, как показано ниже.
Выберите атрибут и проверьте его свойства в инспекторе атрибутов.
Переходные — атрибуты не сохраняются в хранилище постоянства. Их значение основано на других значениях поля и обычно рассчитывается во время выполнения.
Необязательный — указывает обязательный или нет.
Индексируется — обозначает атрибут первичного ключа
Давайте также создадим объект «Пользователь», чтобы понять концепцию отношений в основной базе данных. Добавьте атрибуты ‘userId’ и ‘username’ для объекта ‘User’.
Один пользователь может написать много статей, поэтому создайте отношения «один ко многим» между пользователем и сущностью статьи.
Измените стиль редактора в нижней части окна модели данных на «График». Нажмите CTRL и перетащите из объекта «Пользователь» в объект «Статья». Установите атрибуты отношений, как указано ниже.
Удалить правила
Давайте посмотрим на это с точки зрения сущности пользователя.
Каскад: при удалении объекта пользователя удаляются все связанные с ним статьи.
Запретить: Пользовательский объект не может быть удален до тех пор, пока не будут удалены все объекты статьи.
Nullify: Если объект пользователя удален, обратное отношение «author» будет установлено равным null, при условии, что «author» является необязательным отношением.
Никаких действий: никаких действий не требуется в объекте Article для удаления пользовательских объектов.
Выберите объект и выберите «Редактор» -> «Создать подкласс NSManagedObject».
Классы управляемых объектов Article и User будут сгенерированы при выборе объектов в последующих диалоговых окнах.
Добавить объект в базу данных
NSManagedObjectContext *context = [appDelegate managedObjectContext];
Article *articleDetails = [NSEntityDescription
insertNewObjectForEntityForName:@"Article"
inManagedObjectContext:context];
[articleDetails setValue:strName forKey:@"articleTitle"];
[articleDetails setValue:strArticleDesc forKey:@"articleDesc"];
[appDelegate saveContext];
Создайте переменную appdelegate extern для доступа к переменным и методам в классах SPTAppDelegate.
Любая операция с базой данных может быть выполнена только с помощью контекста управляемого объекта.
Мы создали экземпляр объекта Entity и установили значения переменных strName и StrArticleDesc для атрибутов объекта.
Значения записываются в базу данных с помощью метода сохранения контекста в Appdelegate.
Давайте создадим объект пользователя и установим связь между вновь созданным объектом статьи и объектом пользователя.
User *userObj = [NSEntityDescription
insertNewObjectForEntityForName:@"User"
inManagedObjectContext:context];
[userObj setValue:[NSNumber numberWithInt:123] forKey:@"userId"];
[userObj setValue:@"Kanya" forKey:@"username"];
articleDetails.author = userObj;
[appDelegate saveContext]
Выбрать объекты из базы данных
NSError *error;
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription
entityForName:@"Article" inManagedObjectContext:[appDelegate managedObjectContext]];
[fetchRequest setEntity:entity];
NSArray *fetchedObjects = [appDelegate.managedObjectContext executeFetchRequest:fetchRequest error:&error];
for (Article * articleObjin fetchedObjects) {
NSLog(@"Title: %@", [articleObj valueForKey:@"articleTitle"]);
}
NSFetchRequest используется для извлечения объектов из базы данных. Упоминается объект, для которого должна быть выполнена операция выборки. Массив объектов сущности возвращается при выполнении запроса на выборку.
Условия, которые должны применяться при выполнении условия выборки, также могут быть упомянуты с использованием класса NSPredicate, как указано ниже.
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"author.userId == %@",[NSNumber numberWithInt:111]];
[fetchRequest setPredicate:predicate];
Если строка выше добавлена до выполнения запроса на выборку, будут возвращены статьи, соответствующие пользователю.
Мы также можем отсортировать извлеченные объекты на основе некоторого атрибута, используя класс NSSortDescriptor, как указано ниже
NSSortDescriptor *sortDesc = [NSSortDescriptor sortDescriptorWithKey:@"articleTitle" ascending:YES];
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sortDesc]];
Возвращенные объекты будут отсортированы в порядке возрастания на основе заголовка статьи.
Обновить объекты в базе данных
NSError *error;
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription
entityForName:@"Article" inManagedObjectContext:[appDelegate managedObjectContext]];
[fetchRequest setEntity:entity];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"articleTitle == %@",@"Sample Article"];
[fetchRequest setPredicate:predicate];
NSArray *fetchedObjects = [appDelegate.managedObjectContext executeFetchRequest:fetchRequest error:&error];
if([fetchedObjects count] > 0)
{
Article *articleObj = [fetchedObjects objectAtIndex:0];
articleObj.articleDesc = @"Sample Article Desc";
}
[appDelegate saveContext];
Обновление объекта в базе данных аналогично добавлению объектов в базу данных. Нам нужно выбрать объект, который мы хотим обновить, с помощью предикатов, а затем обновить требуемые атрибуты объекта.
Удалить объекты из базы данных
NSError *error;
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription
entityForName:@"Article" inManagedObjectContext:[appDelegate managedObjectContext]];
[fetchRequest setEntity:entity];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"author.userId == %@",[NSNumber numberWithInt:123]];
[fetchRequest setPredicate:predicate];
NSArray *fetchedObjects = [appDelegate.managedObjectContext executeFetchRequest:fetchRequest error:&error];
for (Article *articleObj in fetchedObjects) {
[appDelegate.managedObjectContext deleteObject:articleObj];
}
[appDelegate saveContext];
Мы получили объект и удалили его, используя метод deleteObject контекста управляемого объекта.
Не забудьте вызывать метод saveContext, когда вы хотите зафиксировать изменения в базе данных.
Вывод
К концу этого урока вы сможете выполнять все основные операции с базой данных.
Попробуйте использовать операции, описанные выше, и приведите предыдущий пример в соответствие с основной интеграцией базы данных.
Загрузите полный исходный код и посмотрите, как интегрирована базовая база данных.