DB Wrapper не отвечает на сообщение? - PullRequest
1 голос
/ 27 апреля 2009

Я разрабатываю для iphone-sdk 2.2.1 (поэтому нет CoreData cry ).

Поэтому я использую проект FMDatabase , который является просто оболочкой SQLite в Obj C. Моя БД работает хорошо при взаимодействии с ним из моего AppDelegate. Я протестировал подключение, вставку и т. Д. Из AppDelegate.

Теперь у меня есть объект данных, который я хочу сохранить в базе данных. Я хотел бы, чтобы это событие происходило из класса ViewController. Давайте посмотрим код:

App Delegate Создает БД в методе applicationDidFinishLaunching. БД объявлена ​​как свойство этого класса, поэтому я могу легко получить к нему доступ.

db = [FMDatabase databaseWithPath:[self getDBPath]];

Это отлично работает, я проверял это. Единственное, что меня немного беспокоит, так это то, что db является свойством класса. Это не должно вызывать проблем, не так ли?

Из того же метода applicationDidFinishLaunching я проверил, как работает простая вставка. Это работает:

[db beginTransaction];
[db executeUpdate:@"INSERT INTO tblDataSamples (...) VALUES (...);"];
[db commit];

Теперь, если я просто возьму этот точный код и перенесу его в метод экземпляра AppDelegate, код больше не будет работать. Я получаю ошибку "EXC_BAD_ACCESS", когда мы нажимаем строку [db beginTransaction].

Поток этого кода на этот вызов: - AltViewController получает кнопку нажмите событие - AltViewController указывает ApplicationDelegate выполнить метод «addSample». - Метод addSample ApplicationDelegate завершается ошибкой в ​​[db beginTransaction].

Теперь, когда я это написал, я думаю, проблема в том, что моя БД теряется после загрузки ApplicationDelegate RootView. Может быть, я ошибаюсь, хотя. У кого-нибудь есть идеи?

!!!!!!!!!

UPDATE! Я только что изменил свой метод addSample, чтобы включить

db = [FMDatabase databaseWithPath:[self getDBPath]];
    if (![db open]) {
        NSLog(@"Could not open db.");
    }

и

[db close];

Вся транзакция работает сейчас. Итак, новый вопрос: как мне сделать базу данных открытой ОДИН РАЗ и оставаться открытой для разных представлений и контроллеров представления?

1 Ответ

2 голосов
/ 27 апреля 2009

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

Хорошей новостью является то, что управление памятью на самом деле довольно легко освоить в Какао. Взгляните на эту страницу для начала, на ней должно быть достаточно информации, чтобы начать работу. Чтобы решить эту конкретную проблему, вам нужно будет вызвать метод retain в вашем объекте db после того, как он создан, и выпустить его, когда он больше не нужен (если вы сохраняете его на весь срок службы вашего приложения, то его выпуск не принесет ничего , но это все еще хорошая практика).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...