2011-06-11 53 views
0

我有一个名为SqliteImageAccess的类,它将提供各种方法来提供对某些sqlite功能的支持。我有一个类型为sqlite3的本地类变量和一个名为opendb的类方法。这个类方法应该只做一件事和一件事。打开数据库。Objective-C - 访问初始化方法内部的类方法

唯一的粘这里的一点是,我的sqlite3的对象将是一个实例变量和Objective-C,不管是什么奇怪的原因,不会让你访问的类方法中的实例变量。显然,在其他语言中,当你实例化一个类时,该类的构造函数可能会调用一个私有方法来初始化一些本地类变量(也许是本地私有变量)。我想通过相当于Objective-C类构造函数方法的sqlite3对象来做同样的事情。也许有人可以帮助,因为我被困在这一个。

很显然,在另一个类中,我可以实例化SqliteImageAccess类,然后调用opendb方法。这工作正常。我不想这样做。当我实例化类时,目标是让类自动处理数据库的打开。

最后,这将是可用做其他工作的SQLite(插入等)的其他方法,我将需要完全访问数据库对象。在此先感谢您的帮助。

//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

@correction - 我将数据库移到实现文件并将其定义为静态。另外我认为我的初始化实际上应该是 - (void)init,但是我得到一个警告,告诉我有冲突的类型。不知道那是关于什么。 – usmsci 2011-06-11 06:14:31

+0

'init'必须声明为返回'id' - 一个通用指针。你已经解决了这个问题吗?看起来你在得到答案后改变了一些东西,我不能完全说出你的问题已经存在了。 – 2011-06-11 06:30:01

+0

警告是因为它应该是 - (id)init而不是 - (void)init。返回类型是“id”。 – Sailesh 2011-06-11 06:30:31

回答

3

在声明opendb作为一类梅索德(+),但您正在使用的接口 - 在执行。通常你应该得到一个警告,你的类实现不完整。更改 - 到+实施opendb作为一个类的方法,并通过

[self opendb]; 

而且叫它+(无效)initilaize只在程序的生命周期调用一次,在想你想一起去

-(id) init; 

眼看着一两件事,您的sqlite3的属性被声明为实例变量,所以你不能从一个类的方法调用它!您必须将sqlite3 * db从.h文件移动到.m文件中,如

static sqlite3 *db; 

@implementation之后。

+0

在我的 - (void)init {[self opendb]; }我得到一些警告:“SqliteImageAccess可能不会响应-opendb,我仍然得到void init的冲突类型,更不用说现在它崩溃了。我猜在我的情况下它必须是一个类方法。我不知道这里发生了什么 – usmsci 2011-06-11 06:21:18

+0

将它移到.m文件是问题的症结所在,所以感谢大家的帮助。我已经改变了我的代码以上更新了现在的工作。谢谢 – usmsci 2011-06-11 06:31:09

+0

只是为了验证 - 尽管每个人都帮忙,但yan回答了第一个问题,不用担心:) – usmsci 2011-06-11 06:34:39

1

观察:

你声明opendb.H作为类方法。

但.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]; 
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的所有实例方法,那么它们对于它们都是可见的。

编辑:如果你不希望共享SqliteImageAccess的所有实例中的一个db实例,那么你应该改变-opendb实例方法,并调用它在你的类的指定初始化(如-init)。在这种情况下,当然,-opendb将有权访问实例变量db