1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/juwenz-DoPersistenceFramework

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
readme.md 8.7 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 26.11.2024 21:40 0520f4f

Проектное введение

Данный фреймворк в основном решает проблему локального сохранения данных в процессе разработки для Apple. На начальном этапе разработки был выбран SQLite, и с тех пор разработчики не хотят использовать CoreData, возможно, потому что считают его менее удобным. Однако люди часто бывают упрямы. Не будем тратить время на пустые разговоры, давайте сразу перейдём к обзору методов.

Обзор методов

  • save: сохранение или обновление объекта;
  • deleteMe: удаление самого объекта;
  • pk: получение первичного ключа объекта, по умолчанию -1;
  • queryByPk: поиск объекта по первичному ключу;
  • saveObjects: пакетное сохранение объектов;
  • deleteAll: пакетное удаление объектов;
  • deleteByPks: пакетное удаление объектов по массиву первичных ключей;
  • allObjects: поиск всех объектов;
  • (NSArray *)objectsWithPage:(NSInteger)page pageLimit:(NSInteger)pageLimit: постраничный поиск;
  • (NSArray *)findByCriteria:(NSString *)criteriaString page:(NSInteger)page pageLimit:(NSInteger): постраничный поиск по критериям;

Методы использования В этой части мы не будем подробно объяснять каждый метод. Вместо этого мы рассмотрим две ситуации, которые часто возникают при сохранении объектов в реальном проекте: объекты без связей и объекты с отношениями.

Объекты без связей Давайте рассмотрим пример кода для сохранения объекта без связей:

// NoRelationshipObject.h
#import "DPDBObject.h"
@interface NoRelationshipObject : DPDBObject {
    NSString *desc;
    NSInteger aNumber;
    int aInt;
    float aFloat;
    double aDouble;
}
@property (nonatomic, strong) NSString *desc;
@property (nonatomic, assign) NSInteger aNumber;
@property (nonatomic, assign) int aInt;
@property (nonatomic, assign) float aFloat;
@property (nonatomic, assign) double aDouble;
@end

Здесь мы объявляем объект NoRelationshipObject, который не имеет связей с другими объектами. Чтобы сохранить этот объект в базе данных, мы можем сделать следующее:

NoRelationshipObject *nrObject = [[NoRelationshipObject alloc] init];
nrObject.desc = @"Это тестовый объект без связей";
noObject.aInt = 2012;
// Игнорируем другие свойства
[noObject save];

Чтобы проверить, успешно ли сохранён объект в базе данных, можно открыть базу данных и убедиться, что запись существует.

Один к одному Теперь создадим новый класс OneToOneObject:

// OneToOneObject.h
#import "DPDBObject.h"
@interface OneToOneObject : DPDBObject {
    NSString *desc;
    NoRelationshipObject *nrObject;
}
@property (nonatomic, strong) NSString *desc;
@property (nonatomic, strong) NoRelationshipObject *nrObject;
@end

Затем создаём экземпляр класса OneToOneObject и присваиваем ему значение:

OneToOneObject *otoObject = [[OneToOneObject alloc] init];
otoObject.desc = @"Тестовый объект один к одному";
otoObject.nrObject = nrObject;
[otoObject save];

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

NSInteger pk = [otoObject pk];
OneToOneObject *object = [OneToOneObject queryByPk:pk];
if (object) {
    // Можно поставить точку останова или написать код для проверки
} else {
    NSLog(@"Проверка не удалась, объект не сохранен");
}

На этом всё. Далее рассмотрим сохранение объектов один ко многим.

Один ко многим Сохранение объектов один к одному и без связей было относительно простым. Сохранение объектов один ко многим может быть более сложным. Мы рассмотрели несколько подходов, включая динамическое определение типа, управление конфигурацией и использование имён для определения типов. В итоге мы отказались от некоторых идей из-за различных проблем.

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

// OneToManyObject.h
#import "DPFBObject.h"
@interface OneToManyObject : DPFBObject {
    NSString *desc;
    NSArray *nrArrs;
}
@property (nonatomic, strong) NSString *desc;
@property (nonatomic, strong) NSArray *nrArrs;
@end

Класс OneToManyObject имеет свойство nrArrs, которое представляет собой массив объектов NoRelationshipObject. Поскольку невозможно явно указать тип элементов массива в Objective-C, как в Java, нам нужно определить тип элементов в методе collectionTypeInfo:

// OneToManyObject.m
#import "OneToManyObject.h"
@implementation OneToManyObject
+ (NSDictionary *)collectionTypeInfo {
    return @{
        @"nrArrs": NSStringFromClass([NoRelationshipObject class])
    };
}

Этот метод возвращает словарь, где ключ nrArrs указывает на класс NoRelationshipObject. Теперь мы можем использовать этот класс для создания и сохранения объектов:

OneToManyObject *otmObject = [[OneToManyObject alloc] init];
NSMutableArray *objects = [NSMutableArray array];
for (NSInteger i = 0; i < 10; i++) {
    NoRelationshipObject *nrObject = [[NoRelationshipObject alloc] init];
    nrObject.desc = [NSString stringWithFormat:@"Тестовый объект без связей-%ld", (long)i];
    [objects addObject:nrObject];
}
otmObject.nrArrs = objects;
[otmObject save];

Мы создали массив объектов NoRelationshipObject и присвоили его свойству nrArrs объекта OneToManyObject. Затем мы сохранили объект OneToManyObject в базе данных.

Для проверки сохранения можно использовать тот же подход, что и для объектов один к одному.

Применимость Фреймворк ещё не завершён и имеет некоторые ограничения:

  • Нет поддержки транзакций. Весь фреймворк не включает обработку транзакций, поэтому если вам нужна эта функция, то придётся искать другое решение.
  • Нет модификации типов свойств. Если вы хотите изменить тип свойства для одного и того же имени, эта функция пока не реализована. Возможно, она будет добавлена позже. Если эти ограничения не являются критичными для вас, вы можете попробовать использовать фреймворк.

Ссылки и благодарности Этот фреймворк основан на идеях из проекта sqliteobjectpersistence. Автор выражает благодарность автору этого проекта за вдохновение и идеи.

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/juwenz-DoPersistenceFramework.git
git@api.gitlife.ru:oschina-mirror/juwenz-DoPersistenceFramework.git
oschina-mirror
juwenz-DoPersistenceFramework
juwenz-DoPersistenceFramework
master