Как интегрировать DBAccess Framework в другую платформу (iOS)

Я пишу одно приложение A, написанное на Objective-C, которое использует мою другую структуру B, которая также написана на Objective-C. Платформа B имеет некоторые операции, связанные с базой данных. Для выполнения этих операций я пытаюсь использовать DBAccess ORM (http://www.db-access.org/).

  1. В B я создал класс модели, базовым классом которого является DBObject.

    @interface SettingsModel : DBObject

  2. AppDelegate приложения A делегирует протокол DBDelegate, в "-(BOOL) application: didFinishLaunchingWithOptions:" устанавливает делегат "[DBAccess setDelegate:self];"
  3. В B есть класс EnvironmentManager, который задает имя базы данных в своем методе init. [DBAccess openDatabaseNamed:@"dbname"];
  4. Объект EnvironmentManager создается из метода viewDidLoad ViewController'а A.
  5. Теперь я пытаюсь сохранить и получить данные из методов viewController A.

Когда я запускаю приложение A с открытыми методами сохранения и извлечения, метод извлечения дает мне сохраненные данные. Но если я прокомментирую раздел сохранения данных и запущу A, то предыдущие данные не будут получены.

  1. Можно ли использовать инфраструктуру DBAccess из другой структуры?
  2. Если возможно, то, пожалуйста, помогите мне понять проблему из моего описания выше.

РЕДАКТИРОВАТЬ:

Я пробовал некоторые другие варианты, которые обсуждаются в разделе комментариев @Adrian_H. У меня есть один и тот же путь как в A, так и в B, используя

NSURL *applicationCachesDirectory = [[[NSFileManager defaultManager] URLsForDirectory:NSCachesDirectory inDomains:NSUserDomainMask] lastObject];
NSLog(@"%@",[applicationCachesDirectory path]);

person iOS-Developer84    schedule 25.01.2016    source источник


Ответы (2)


Похоже, путь к базе данных неизвестен. Знаете ли вы, создается ли вообще файл базы данных?

Если он не создается, вам нужно будет реализовать метод DBSettings, чтобы явно указать путь к месту хранения файла БД. (см. DBAccess, создающий пользовательские настройки DBAccessSettings).

Это классическое поведение при использовании базы данных :memory: из-за недопустимого пути.

Также может быть так, что что-то каким-то образом инициализирует классы DBObject перед запуском метода -(BOOL) application: didFinishLaunchingWithOptions:, поэтому вы всегда можете сначала попытаться закрыть базу данных, а затем снова открытие его. Если это окажется проблемой, я могу исправить и выпустить новую версию фреймворка, так как это не ожидаемое поведение.

person Adrian_H    schedule 25.01.2016
comment
Большое спасибо за твою помощь. - person iOS-Developer84; 25.01.2016
comment
Но модель структуры B (DBObject) не инициализирована. Я установил пользовательскую настройку в делегате A, реализовав метод - (DBAccessSettings*)getCustomSettings. Я также реализую метод -(void) databaseOpened, хотя имя базы данных или любые другие параметры используются только фреймворком B. Я создал новый класс модели для тестирования в A и вызываю тот же метод сохранения и извлечения для этой новой модели. Работает только для новой модели. -(void) метод databaseOpened вызывается только при вызове метода запроса/выборки новой модели (A). - person iOS-Developer84; 25.01.2016
comment
Создается ли файл базы данных? Какие объекты он имеет внутри? - person Adrian_H; 25.01.2016
comment
Файл базы данных создается только тогда, когда я добавляю новую модель в A и вызываю метод сохранения. Есть три файла с расширениями db, wal и shm. Если я открою файл shm, там будет информация только о модели A. Но нет информации о модели фреймворка B. - person iOS-Developer84; 25.01.2016
comment
Хорошо, похоже, что фреймворк внутри фреймворка не имеет доступа к пути приложения. Это не то, что было протестировано. Вы можете обойти это следующим образом: 1) Сначала установите делегат, затем closeDatabase: nil, затем снова openDatabase:. Затем это должно запросить объект DBSettings, если вы поместили папку/местоположение базы данных в класс настроек, то он должен создать ее там. Проверьте, установив его в другом месте. - person Adrian_H; 25.01.2016

Проблема в том, что инфраструктура DBAccess инициируется дважды. Один инициируется в вашей собственной структуре, а другой инициируется в вашем приложении. Для решения этой проблемы:

  1. Выберите проект > Настройки сборки > Открыть флаги компоновщика
  2. Удалите из него инфраструктуру DBAccess. Также удалите $(унаследовано).
  3. Сохраните, очистите и запустите
person farhad rubel    schedule 02.03.2016