2012-10-02 34 views
0

我有一个应用程序,几乎遵循here描述的方法。关键代码如下:如何更改存储在单例中的SQL数据库?

#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]; 
} 

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

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

回答

0

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

因此,我创建了一个名为useDatabase的方法,它关闭了上一个连接并打开一个新连接。

步骤: 你 - (ID)初始保持不变

在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 database];

,因此它首先被初始化。

然后,当你想改变使用的.sqlite,您可以拨打:

[FailedBankDatabase useDatabase:@ “anOtherDatabase”]

我认为你可以做到这一点,当你不必经常更改数据库。在我的情况下,我用这个一次非常第一个屏幕,与3个按钮,在那里我会选择将使用数据库。

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

希望它能帮助,

Jery

+0

谢谢您的回答@darksider我实现我自己的答案(见下文/以上),但随后发现,我的数据库是如此之大,该应用程序是iOS5的下难以忍受的慢,确定在iOS6下。所以我可能不得不去解决你的问题,尽管我也在考虑CoreData。非常感激。 –

0

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

相关问题