2009-12-05 61 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結構,並且不能被保留。 – 2009-12-05 14:57:02

+1

男人我討厭正確答案的兩次標記。 – KevinDTimm 2009-12-05 20:27:31

4

代碼有兩個問題。

首先,聲明不正確;

@property (nonatomic, retain) database; 

編譯此生成錯誤信息是這樣的:

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

代碼缺少類型說明符。特別是,它應該是這樣的:現在

@property (nonatomic, retain) sqlite3 *database; 

,與固定的,你會看到錯誤的kevindtimm提到過:

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

更改@property到assign,而不是retain

或者,更好的是,使用核心數據。除非你有一個SQLite數據庫來自爲其設置模式的其他源,否則直接去SQLite會浪費工程時間。

3

你不能這樣做,因爲sqlite3不是Objective C對象。保留的屬性必須是客觀的C對象。你可以通過一個簡單的方法來說明一個Objective C對象,該類型名稱通常在CamelCase中。

sqlite3數據庫句柄只是一個指向普通C結構的指針。您可以將其設置爲已分配的屬性,但這意味着如果您爲該屬性指定了另一個值,連接將不會自動關閉。爲了使分配,財產,你會怎麼做:

@property (nonatomic, assign) database; 

您還需要考慮,如果你真的想這樣做這些事情的方式。這裏有兩個建議:

  1. 考慮使用核心數據。學習需要一點努力,但不過是學習sqlite3,並且提供了很多sqlite不具備的功能。
  2. 您可能想要考慮爲什麼要將sqlite3連接作爲屬性公開。數據庫管理器類應該可以將sqlite3連接作爲私有成員變量。創建DatabaseClass的方法來打開sqlite3數據庫,檢索數據,添加數據,關閉數據庫等。其餘的程序會調用這些方法,但不知道DatabaseClass在後臺使用sqlite3。這樣,如果您決定更改數據存儲方式,則只需在一個位置進行更改,而不必更改與DatabaseClass交互的所有類。 (其中一個方法核心數據可以存儲其數據是作爲一個sqlite3的數據庫,所以你基本上可以重塑核心數據的更簡單的版本。)
相關問題