2012-05-11 14 views
0

私はこのクラスの静的変数を含むSQLiteのとDBに格納されているすべてのデータをリコールし、可変配列静的変数の関数を2回呼び出すか?

#define kFilename @"negozi.sqlite" 

@implementation ShopDatabase 

static ShopDatabase *database; 

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

- (id)init 
{ 
    self = [super init]; 
    if (self) { 

    // Create the path to the database in the Documents directory for the bundle itself is not writable 
    NSArray *pathsToDocuments = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [pathsToDocuments objectAtIndex:0]; 
    databasePath = [documentsDirectory stringByAppendingPathComponent:kFilename]; 
    if (![[NSFileManager defaultManager] isReadableFileAtPath:databasePath]) { 
     if ([[NSFileManager defaultManager] copyItemAtPath:yourOriginalDatabasePath toPath:databasePath error:NULL] != YES) 
      NSAssert2(0, @"Fail to copy database from %@ to %@", yourOriginalDatabasePath, databasePath); 
    } 

    // --- open db 
    if(sqlite3_open([databasePath UTF8String], &database) != SQLITE_OK){ 
     NSLog(@"Failed to open database"); 
    }else { 
     NSLog(@"Database opened"); 
    } 
} 
return self; 
} 

- (NSMutableArray *) getAllShops{ 

// ------ read all the db 
NSMutableArray *returnArray=[[NSMutableArray alloc] init]; 
NSString *query= @"SELECT * FROM negozio"; 
sqlite3_stmt *statement; 

if (sqlite3_prepare_v2(database, [query UTF8String], -1, &statement, NULL) == SQLITE_OK){ 
    NSLog(@"Prepared database"); 
    while (sqlite3_step(statement)==SQLITE_ROW) { 
      int uniqueId = sqlite3_column_int(statement, 0);  
      NSMutableString *nome = [NSString stringWithUTF8String:(char *)sqlite3_column_text(statement, 1)]; 
     ShopInfo *info= [[ShopInfo alloc] initWithUniqueId:uniqueId nome:nome]; 
     [returnArray addObject:info]; 
    } 
    sqlite3_finalize(statement); 
} 

return returnArray; 
} 

@end 
にそれらを充填されたタスク機能getAllShopで実現データベースを表す「データベース」を有します

私は別のクラスからデータベースからデータを取り出す必要があります。これを行うにはgetAllShopを呼び出すとすべてうまく行きます。このように、私は私の配列shopinfoにデシベルのすべてのデータを持っている:

NSMutableArray *shopInfo=[[ShopDatabase database] getAllShops]; 

は今、私のデータベースは、私は2つのテーブルビューを埋めるために使用する必要があるデータが含まれているので、私はこの2回実行する必要があります:1最初のテーブルビューを表すクラスの時間と2番目のテーブルビューを表すクラスの時間です。私が最初のビューでこれを行うと、すべてうまくいくが、同じことを二度目に行うと、Xcodeは私に悪いアクセスエラーを与える。私は同じクラスにコードを2回実行しようと、これは私がに管理することはできませんので、私は客観的Cへの初心者です(lldb)

例外をスロー呼ばTERMINATE

2012-05-11 13:06:54.897 Shopping Mall[11333:707] -[NegozioPartenza getAllShops]: unrecognized selector sent to instance 0x14b8c0 
2012-05-11 13:06:54.899 Shopping Mall[11333:707] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NegozioPartenza getAllShops]: unrecognized selector sent to instance 0x14b8c0' 
*** First throw call stack: 
(0x33ad188f 0x325c3259 0x33ad4a9b 0x33ad3915 0x33a2e650 0xa4141 0x35727e33 0x3574c629 0x35710d7d 0x357d34dd 0x3571955d 0x3571940b 0x357d34a3 0x35788873 0x357881b7 0x357d1d89 0x357d04eb 0x3582b82b 0x33a2b3fd 0x35709faf 0x35709f6b 0x35709f49 0x35709cb9 0x3570a5f1 0x35708ad3 0x357084c1 0x356ee83d 0x356ee0e3 0x32fa622b 0x33aa5523 0x33aa54c5 0x33aa4313 0x33a274a5 0x33a2736d 0x32fa5439 0x3571ce7d 0xa2515 0xa24c0) 

を得るものです何がポイントであるかを理解する。どのように私は静的変数の関数を2回呼び出すことができますか?ありがとうございました。

編集:おそらく[ShopDatabaseデータベース]を呼び出すinitializazioneのコンストラクタを混乱させる2回目を有効にしますか?私は変数が静的であると言うと、そのクラスのすべてのオブジェクトに対してインスタンスが1つしかないことを意味します。だから私は最初にそれを作成した後、その一意のインスタンスにアクセスできますか?私はあなたが静的変数を使用するときに何が起こるのかを間違っていると思います...

答えて

1

2回目の通話で有効な返品はありません。

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

2番目の呼び出しデータベースでは、何も返さず、何も返しません。すべてのコントロールパスが値を返すわけではないという警告が表示されます。

これは正しい方法です。

+(ShopDatabase *)database{ 
    if (database==nil) { 
     database = [[ShopDatabase alloc] init]; 
    } 

    return database; 
} 
+0

うわー、それは本当です!今それは動作します!効果的には、私は "コントロールが非終了機能の終わりに到達する"ということを推測していました..しかし、私はまだ警告の重要性を与えません...ありがとうございました! –

1

最初の呼び出しの後、どこかでdatabaseがリリースされています。その後、タイプNegozioPartenzaのオブジェクトが同じ場所に作成されています。 [ShopDatabase database]の2番目の呼び出しでこのオブジェクトが返され、そのオブジェクトには​​が送信されますが、明らかにそのメソッドは実装されていません。

+0

がリリースされていますか?私はARCを使用しているため何も公開していないので、すべてをリリースしています...しかし、テストは完了しました。 getAllShops]; [[ShopDatabase database] getAllShops]; リリースする時間や理由がなかったので、右か? –

+0

と2番目のケースで何が起こったのですか?私は、別のクラスからgetAllShopを呼び出すと、悪いアクセスを与えてしまいました(そして、より具体的なエラーコードはありません)助けてくれてありがとう –

関連する問題