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

これで、アプリは期待どおりに1つのデータベースで動作します。しかし、ユーザーがボタンに触れたときに別のデータベースに切り替えられるようにしたいと思います。ボタンハンドラーとロジックは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で)、シングルトンを1回呼び出します。

[FailedBankDatabaseデータベース];

、最初に初期化されるようにします。

次に、使用する.sqliteを変更する場合は、次のように呼び出すことができます。

[FailedBankDatabase useDatabase:@ "anOtherDatabase"]

データベースを頻繁に変更する必要がない場合は、これを実行できると思います。私の場合、これを最初の画面で1使用し、3つのボタンを使用して、データベースを使用するかどうかを選択します。

より複雑なケースでは、マルチスレッドを含む例では、他の場所で使用されている間、接続が少しの間閉じられるため、これを行うべきではありません。

それが役に立てば幸い、

ジェリー

于 2012-10-12T09:42:50.497 に答える