Я разрабатываю для 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];
Вся транзакция работает сейчас. Итак, новый вопрос: как мне сделать базу данных открытой ОДИН РАЗ и оставаться открытой для разных представлений и контроллеров представления?