2012-05-11 63 views
0

我有一個包含一個靜態變量這個類「數據庫」,其表示與源碼和功能getAllShop哪個任務正在回收所有被存儲在DB中的數據,並將它們填充到一個可變的陣列調用兩次靜態變量的函數?

#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並且一切順利。通過這種方式,我有DB的所有數據到我的數組shopinfo:

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

現在,我的數據庫包含我需要用它來填充兩個表視圖數據,所以我需要執行此兩次:一個代表第一個表格視圖和第二個表格視圖中的一個。當我在第一個視圖中執行此操作時一切順利,但是當我第二次執行相同操作時,Xcode會給我一個不良的訪問錯誤。我試圖在同一個班執行代碼的兩倍,這就是我得到

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) 

終止叫做拋出異常(LLDB)

我是一個新手到目標C,所以我不能設法明白什麼是重點。我怎樣才能在一個靜態變量上調用兩次函數?謝謝。

編輯:也許調用[ShopDatabase數據庫]第二次激活initializazione的構造函數使混亂?當我說一個變量是靜態的時,這意味着對於該類的每個對象只有一個它的實例,對吧?那麼第一次創建後如何訪問這個獨特的實例呢?我想我搞亂了當你使用一個靜態變量時會發生什麼......

回答

1

第二次通話沒有有效的回報。

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

在第二個調用數據庫不是零,你不會返回任何東西。你應該得到一個警告,並不是所有的控制路徑都返回一個值。

這是正確的方法。

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

    return database; 
} 
+0

哇,那是真的!現在它工作了!實際上,我在猜測「控制到達非終端功能的結束」可能意味着什麼......但我仍然不給予警告的正確重要性......非常感謝! –

1

在你第一次通話後,database被釋放。隨後,類型NegozioPartenza的對象正在同一位置創建。對[ShopDatabase database]的第二次調用將返回此對象,然後您將​​發送給該對象,該對象顯然不會實現該方法。

+0

正在發佈?我沒有解釋任何東西,因爲我使用ARC,所以它是他釋放所有......但測試完成,給出你正在檢查的錯誤,只執行這個事件: NSMutableArray * shopInfo = [[ShopDatabase數據庫] getAllShops]; [[ShopDatabase database] getAllShops]; 所以沒有時間或理由發佈,對吧? –

+0

和第二種情況發生了什麼?我的意思是,當我從另一個班級調用getAllShop時,它給了我一個不好的訪問權限(並且沒有更多特定的錯誤代碼)謝謝你的幫助 –