2009-04-27 4 views
1

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 방법을 변경. 따라서 새로운 질문은 데이터베이스를 한 번 열어 놓고 다른 뷰와 뷰 컨트롤러를 열어 두는 것입니다.

+0

Sqlite3 API를 사용하는 것이 더 쉬울 수도 있습니다. 정말 간단하고 간결합니다. 실제로 사용하는 함수에 대한 객체 래퍼/편의를 쉽게 만들 수 있습니다. –

+0

db = [[FMDatabase databaseWithPath ...] retain] 또는 [self setDb : [FMDatabase databaseWithPath ...]] 여기서 db는 "보유"속성이있는 속성으로 설정됩니다. – lostInTransit

답변

2

아직 메모리 관리 규칙을 모르기 때문에 문제가 발생했습니다. 이 경우 databaseWithPath: 메서드는 자동 실행 된 개체를 반환하며이 개체는 실행 루프 끝 부분에서 처리됩니다. db 포인터가 여전히 유효하지 않은 메모리 위치를 가리 키기 때문에 나중에 액세스하려고 시도 할 때 EXC_BAD_ACCESS 오류가 표시됩니다.

좋은 소식은 실제로 메모리 관리가 실제로 코코아에서 배우기 쉽다는 것입니다. 처음에는 this page을 보시고, 충분한 정보를 가지고 있어야합니다.이 특정 문제를 해결하려면 db 객체가 생성 된 후 db 객체의 retain 메서드를 호출하고 더 이상 필요하지 않을 때 해제해야합니다 (응용 프로그램의 수명을 유지하는 경우 해제하지 않아도 아무 것도 얻을 수 없지만 여전히 좋은 습관입니다.)

+0

그래서 더 나은 방법은 무엇입니까? DB와 상호 작용 하는가? 트랜잭션을 수행하거나 응용 프로그램의 수명 동안 열어 둘 때마다 열거 나 닫으십시오. 지금 당장은 db의 보유 수를 +1하지 않았기 때문에 매번 열리고 닫힙니다. AppDelegate에서 생성시이를 유지하는 것이 더 낫지 않습니까? 또한 DB를 정적으로 선언하는 것이 유익할까요? – Buffalo

+0

db 컨트롤러 인스턴스를 응용 프로그램 컨트롤러와 같은 전역 응용 프로그램 수명 컨트롤러 중 하나에 배치하는 것으로 시작하지만 최종 디자인은 사용자 고유의 디자인 및 성능 고려 사항에 따라 달라집니다. –

관련 문제