我们可以属性/合成到sqlite3 *数据库对象吗?

时间:2009-12-05 10:59:41

标签: iphone objective-c cocoa-touch sqlite

我有代码段,

就是这样......

#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

我的问题是我可以这样做吗(注释事项)。如果不是什么工作?

3 个答案:

答案 0 :(得分:5)

经验测试表明

@property (nonatomic, retain) database; 

不起作用(具体来说,不编译)。然而,

@property (nonatomic, assign) sqlite3 *database; 

确实

答案 1 :(得分: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会浪费工程时间。

答案 2 :(得分: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交互的所有类。 (Core Data可以存储其数据的方式之一是作为sqlite3数据库,因此您基本上可以重新构建更简单的Core Data版本。)