2009-12-05 3 views
3

내가 코드를 가지고 다음과 같이이다우리는 sqlite3 * 데이터베이스 객체를 특성화/합성 할 수 있습니까?

...

#import <sqlite3.h> 

@interface DatabaseClass : NSObject { 

    sqlite3    *database; 
} 
@property (nonatomic, retain) database;//////this////// 

@end 

In the implementation file; 

#import "DatabaseClass.h" 

@implementation DatabaseClass 

@synthesize database;//////this/////// 

@end 

내 질문에 나는이 (주석 일을) 할 수있다. 그리고 만약 작품이 아니라면 무엇입니까?

답변

5

경험적 테스트 (특히, 컴파일되지 않습니다)

@property (nonatomic, retain) database; 

이 작동하지 않는 것을 알 수있다. 그러나

@property (nonatomic, assign) sqlite3 *database; 

않습니다.

+0

(비 원자, 할당)이 작동하는 이유는 무엇입니까? nonatomic, retain)은 데이터베이스 ivar이 Objective-C 객체가 아니고, C 구조체이며, 유지할 수 없다는 것입니다. –

+1

남자는 옳은 대답을 위해 두 번 아래로 표시되는 것을 싫어합니다. – KevinDTimm

4

코드에 두 가지 문제점이 있습니다.

먼저 선언이 잘못되었습니다.

error: expected specifier-qualifier-list before 'database' 

코드는 형식 지정자 누락이 컴파일

@property (nonatomic, retain) database; 

같은 오류 메시지가 뭔가를 생성합니다. 즉 고정으로 kevindtimm도 언급으로, 오류를 볼 수 있습니다

@property (nonatomic, retain) sqlite3 *database; 

이제 : 특히, 같이한다

error: property 'database' with 'retain' attribute must be of object type 

변경에게 @property를 assign 대신 retain에.

또는 Core Data를 사용하는 것이 더 좋습니다. 스키마가 설정된 다른 소스의 SQLite 데이터베이스가 없으면 SQLite로 직접 이동하면 엔지니어링 시간이 낭비됩니다.

3

sqlite3가 Objective C 개체가 아니기 때문에 그렇게 할 수 없습니다. 보존 된 속성은 객관적인 C 객체 여야합니다. Objective C 객체라는 것을 쉽게 알 수있는 한 가지 방법은 일반적으로 형식 이름이 CamelCase에 있다는 것입니다.

sqlite3 데이터베이스 핸들은 일반적인 C 구조체에 대한 포인터입니다. 할당 된 속성으로 지정할 수는 있지만 속성에 다른 값을 할당하면 연결이 자동으로 닫히지 않습니다. 속성을 지정하려면 다음을 수행하십시오.

@property (nonatomic, assign) database; 

당신은 실제로 이런 식으로 작업하고 싶은지 고려하고 싶을 것입니다. 여기에는 두 개의 수제가 있습니다 :

  1. 코어 데이터 사용을 고려하십시오. 그것은 배우기 위해 약간의 노력이 필요하지만 sqlite3을 배우는 것 이상은 아니며 sqlite가 제공하지 않는 많은 기능을 제공합니다.
  2. sqlite3 연결을 속성으로 표시하는 이유를 생각해보십시오. 데이터베이스 관리 프로그램 클래스에는 sqlite3 연결이 개인용 변수로 있어야합니다. sqlite3 데이터베이스를 열고, 데이터를 검색하고, 데이터를 추가하고, 데이터베이스를 닫는 등의 DatabaseClass 메소드를 만듭니다. 나머지 프로그램은 이러한 메소드를 호출하지만 DatabaseClass가 백그라운드에서 sqlite3을 사용한다는 것을 알지 못합니다.그렇게하면 데이터 저장 방법을 변경하기로 결정한 경우 DatabaseClass와 상호 작용하는 모든 클래스를 변경하는 대신 한 곳에서 변경해야합니다. (코어 데이터가 데이터를 저장할 수있는 방법 중 하나는 기본적으로 코어 데이터의 훨씬 단순한 버전을 재 작성하려는 것입니다.)
관련 문제