0

我有一个应用程序,它几乎遵循此处描述的方法。关键代码如下:

#import <Foundation/Foundation.h>
#import <sqlite3.h>     
@interface FailedBankDatabase : NSObject {
    sqlite3 *_database;
}     
+ (FailedBankDatabase*)database;
- (NSArray *)failedBankInfos;    
@end

#import "FailedBankDatabase.h"
#import "FailedBankInfo.h"
@implementation FailedBankDatabase
static FailedBankDatabase *_database;

+ (FailedBankDatabase*)database {
if (_database == nil) {
    _database = [[FailedBankDatabase alloc] init];
}
return _database;
}

- (id)init {
if ((self = [super init])) {
    NSString *sqLiteDb = [[NSBundle mainBundle] pathForResource:@"banklist" 
        ofType:@"sqlite3"];

    if (sqlite3_open([sqLiteDb UTF8String], &_database) != SQLITE_OK) {
        NSLog(@"Failed to open database!");
    }
}
return self;
}

- (void)dealloc {
    sqlite3_close(_database);
    [super dealloc];
}

现在,该应用程序可以按预期使用一个数据库。但是,我希望能够在用户触摸按钮时切换到不同的数据库。我有按钮处理程序和逻辑 OK,我存储要使用的数据库的名称并可以检索它。但是,无论我做什么,我总是得到相同的(原始)数据库被调用。我担心示例中_database与 类型的对象关联的句柄sqlite3没有正确更改,因此我没有正确打开数据库。我应该如何去改变这个?您不能重新初始化单例,但我需要更改其中存储的内容,在这种情况下_database。谢谢。

编辑:我会补充说,如果我要求_database是一个指针。所以我需要打开一个新数据库(并关闭我猜的第一个)并在此过程中为新数据库提供一个新地址。

4

2 回答 2

0

经过一些额外的研究,我没有成功回答所提出的问题。但是,看起来FMDB可能可以处理这个任务,我只是不想在我的项目中添加一个大型框架。我以完全不同的方式解决了我的问题:我修改了每个数据库,给它一个标识列,然后将它们组合起来,并修改了我用来仅选择所需的原始数据库块的查询。当然,这种方法仅在数据库具有相同结构时才有效。

于 2012-10-09T10:39:26.077 回答
0

我有同样的问题,但无法修改数据库(它们被用于其他项目)。

所以,我创建了一个名为 useDatabase: 的方法,它关闭之前的连接,然后打开一个新连接。

步骤:您的 - (id)init 保持不变

在 FailedBankDatabase 中,您创建一个关闭和打开具有新数据库名称的数据库的方法

-(void)useDatabase:(NSString*)database {

    sqlite3_close(_database);

    NSString *sqLiteDb = [[NSBundle mainBundle] pathForResource:database 
    ofType:@"sqlite3"];

    if (sqlite3_open([sqLiteDb UTF8String], &_database) != SQLITE_OK) {
        NSLog(@"Failed to open database!");
    }

}

在最开始时(例如在 appDidFinishLaunching 中),您调用单例一次

[FailedBankDatabase 数据库];

, 所以它首先被初始化。

然后,当您想更改使用的 .sqlite 时,可以调用:

[FailedBankDatabase useDatabase:@"anOtherDatabase"]

我认为当您不必经常更改数据库时可以这样做。就我而言,我在第一个屏幕上使用了一次,带有 3 个按钮,我将在其中选择要使用的数据库。

对于更复杂的情况,例如涉及多线程,您不应该这样做,因为它会关闭连接一段时间,而它会在其他地方使用。

希望能帮助到你,

杰瑞

于 2012-10-12T09:42:50.497 回答