2009-12-05 52 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的数据库,所以你基本上可以重塑核心数据的更简单的版本。)
相关问题