我有一个名为SqliteImageAccess的类,它将提供各种方法来支持某些sqlite功能。我有一个sqlite3类型的本地类变量和一个名为opendb的类方法。这个类方法应该只做一件事。打开数据库。
这里唯一的粘性点是我的sqlite3对象将成为一个实例变量而Objective-C出于任何奇怪的原因,不允许您访问类方法中的实例变量。显然,在其他语言中,当您实例化一个类时,该类的构造函数可能会调用私有方法来初始化一些本地类变量(可能是本地私有变量)。我想通过相当于Objective-C类构造函数方法对我的sqlite3对象做同样的事情。也许有人可以提供帮助,因为我被困在这个问题上。
显然在另一个类中,我可以实例化SqliteImageAccess类,然后调用opendb方法。这很好。我不想这样做。当我实例化类时,目标是使类自动处理数据库的打开。
最后,使用其他方法可以执行其他sqlite工作(插入等),我将需要对db对象的完全访问权限。提前感谢您的帮助。
// SqliteImageAccess.h
@interface SqliteImageAccess : NSObject {
}
+(void)opendb; //class method
@end
// SqliteImageAccess.m
#import "SqliteImageAccess.h"
@implementation SqliteImageAccess
static sqlite3 *db;
+(void)initialize{
[self opendb];
}
+(void)opendb{
int open = sqlite3_open("/Users/csmith/RPG/cws.sqlite3", &db);
if(open == SQLITE_OK){
NSLog(@"Database was opened successfully");
}
else {
NSLog(@"open result = %d", open);
}
}
@end
答案 0 :(得分:3)
在接口中,您将opendb声明为类方法(+),但您正在使用 - 在实现中。 Normaly你应该得到一个警告,你的类实现是不完整的。将 - 更改为+以实现opendb作为类方法并通过
调用它[self opendb];
此外,+(void)initilaize只在程序生命周期中被调用一次,认为你想和
一起使用-(id) init;
再看一下,你的sqlite3属性被声明为一个实例变量,所以你不能从类方法中调用它!您必须将.hite * * db从.h移动到.m文件
static sqlite3 *db;
@implementation之后。
答案 1 :(得分:1)
观察:
您已将 .h 中的opendb
声明为类方法。
但在.m类中,您将它用作实例方法。
+(void)opendb{
int open = sqlite3_open("/Users/csmith/RPG/cws.sqlite3", &db);
if(open == SQLITE_OK){
NSLog(@"Database was opened successfully");
}
else {
NSLog(@"open result = %d", open);
}
}
建议您与实例(类对象)绑定,并在创建数据库访问类的实例时,从类外部明确地向opendb
发送消息。
- (void) init {
if (self = [super init]) {
//initialize all your class member here,
}
}
你的opendb实例方法函数
- (void)opendb{
int open = sqlite3_open("/Users/csmith/RPG/cws.sqlite3", &db);
if(open == SQLITE_OK){
NSLog(@"Database was opened successfully");
}
else {
NSLog(@"open result = %d", open);
}
}
现在让我们创建sqllite3访问类的实例。
SqliteImageAccess* smySqliteImageAccess = [SqliteImageAccess alloc] init];
[smySqliteImageAccess opendb];
答案 2 :(得分:1)
如果SqliteImageAccess的所有实例都要共享相同的数据库实例(sqlite3 *),那么您可以全局声明它而不是将其声明为实例变量:
// SqliteImageAccess.m
@implementation SqliteImageAccess
// 'db' will be shared by all instances of SqliteImageAccess
static sqlite3 *db;
+ (void)initialize {
if (self == [SqliteImageAccess class]) {
opendb(&db); // assumes opendb is a function, not a method
}
}
如果您在此文件中创建SqliteImageAccess的所有实例方法,则db
将对他们可见。
编辑:如果您不想在SqliteImageAccess的所有实例中共享一个db
实例,那么您应该将-opendb
更改为实例方法,并在类的指定初始化程序中调用它(如-init
)。在这种情况下,-opendb
当然可以访问实例变量db
。