iphone-sdk 2.2.1 용으로 개발 중입니다. (CoreData가 없으므로 울음).DB 래퍼가 메시지에 응답하지 않습니까?
그래서 Obj C의 SQLite Wrapper 인 FMDatabase project을 사용하고 있습니다. AppDelegate와 상호 작용할 때 DB가 잘 작동합니다. AppDelegate에서 연결, 삽입 등을 테스트했습니다.
이제 데이터베이스에 저장하려는 데이터 개체가 있습니다. 이 이벤트를 ViewController 클래스에서 발생시키고 싶습니다.
응용 프로그램 대리인 applicationDidFinishLaunching 메서드에서 DB를 만듭니다. DB는이 클래스의 속성으로 선언되므로 쉽게 액세스 할 수 있습니다.
db = [FMDatabase databaseWithPath:[self getDBPath]];
괜찮습니다. 테스트 해 보았습니다. 내가 약간 걱정하는 유일한 것은 'db'클래스의 속성입니다. 그게 문제를 일으키지 않아야합니까?
동일한 applicationDidFinishLaunching 메서드에서 간단한 삽입을 사용하여 작동하는지 테스트했습니다. 이 작품 :
[db beginTransaction];
[db executeUpdate:@"INSERT INTO tblDataSamples (...) VALUES (...);"];
[db commit];
을 지금, 나는 단순히이 정확한 코드를 가지고 가고 AppDelegate에의 인스턴스 메서드로 이동하는 경우, 코드는 더 이상 작동하지 않습니다. [db beginTransaction] 행에 도달했을 때 "EXC_BAD_ACCESS"
오류가 발생합니다.
이 호출이 코드의 흐름 : - AltViewController는 버튼을 탭 이벤트 를 수신 - AltViewController는 "addSample"방법을 실행하기 위해 ApplicationDelegate을 알려줍니다. - ApplicationDelegate의 addSample 메서드가 [db beginTransaction]에서 실패합니다.
이제이 글을 작성 했으므로 ApplicationDelegate가 RootView를로드 한 후에 내 DB가 손실된다는 문제가 있다고 생각합니다. 어쩌면 나는 틀렸다. 누구든지 아이디어가 있습니까?
!!!!!!!!!
업데이트! 난 그냥 전체 트랜잭션이 현재 작동
db = [FMDatabase databaseWithPath:[self getDBPath]];
if (![db open]) {
NSLog(@"Could not open db.");
}
및
[db close];
을 포함하는 내 addSample 방법을 변경. 따라서 새로운 질문은 데이터베이스를 한 번 열어 놓고 다른 뷰와 뷰 컨트롤러를 열어 두는 것입니다.
Sqlite3 API를 사용하는 것이 더 쉬울 수도 있습니다. 정말 간단하고 간결합니다. 실제로 사용하는 함수에 대한 객체 래퍼/편의를 쉽게 만들 수 있습니다. –
db = [[FMDatabase databaseWithPath ...] retain] 또는 [self setDb : [FMDatabase databaseWithPath ...]] 여기서 db는 "보유"속성이있는 속성으로 설정됩니다. – lostInTransit