2010-01-14 31 views
0

我的NSMutableArray創建代碼由於某種原因被完全繞過。理論上它應該創建一個基於sqlite數據庫的NSMutableArray。只有一個警告消息,沒有錯誤。我錯過了什麼? 實現文件是:礦山代碼繞過數組創建從sqlite數據庫循環

#import "iProspectFresno LiteAppDelegate.h" 
#import "MainViewController.h" 
#import "Mine.h" 
#import <Foundation/Foundation.h> 
@implementation iProspectFresno_LiteAppDelegate 
@synthesize window; 
@synthesize mainViewController; 
@synthesize mines; 
-(void) checkAndCreateDatabase { 
    BOOL success; 
NSFileManager *fileManager = [NSFileManager defaultManager]; 
success = [fileManager fileExistsAtPath:databasePath]; 
if(success) return; 
NSString *databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:databaseName]; 
[fileManager copyItemAtPath:databasePathFromApp toPath:databasePath error:nil]; 
} 
-(void) readMinesFromDatabase 
{ 
sqlite3 *database; 
mines = [[NSMutableArray alloc] init]; 
NSLog(@"readMinesFromDatabase initialized"); 
if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) { 
    const char *sqlStatement = "select * from MinesoftheMotherLode"; 
    sqlite3_stmt *compiledStatement; 
    NSLog(@"first if statement"); 
    if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) 
    { 
    NSLog(@" second if statement initialized"); 
    while(sqlite3_step(compiledStatement) == SQLITE_ROW) 
    { 
    NSNumber *aentryNumber = [NSNumber numberWithInt:(int)sqlite3_column_int(compiledStatement, 1)]; 
    NSString *amineName = [NSString stringWithUTF8String:(char*)sqlite3_column_text(compiledStatement, 2)]; 
    NSString *amineType = [NSString stringWithUTF8String:(char*)sqlite3_column_text(compiledStatement, 3)]; 
    NSString *astatus = [NSString stringWithUTF8String:(char*)sqlite3_column_text(compiledStatement, 4)]; 
    NSNumber *alatitude = [NSNumber numberWithDouble:(double)sqlite3_column_double(compiledStatement, 5)]; 
    NSNumber *alongitude = [NSNumber numberWithDouble:(double)sqlite3_column_double(compiledStatement, 6)]; 
    NSString *ametal =[NSString stringWithUTF8String:(char*)sqlite3_column_text(compiledStatement, 7)]; 
    BOOL *adisplay = NO; 
    NSNumber *acoverRegion =[NSNumber numberWithInt:(int)sqlite3_column_int(compiledStatement, 9)]; 
    NSLog(@"mine", aentryNumber, amineName, amineType, astatus, alatitude, alongitude, ametal, adisplay, acoverRegion); 
    Mine *mine = [[Mine alloc] initWithEntryNumber:aentryNumber mineName:amineName mineType:amineType status:astatus latitudeInitial:alatitude longitudeInitial:alongitude metal:ametal display:adisplay coverRegion:acoverRegion]; 
    [mines addobject:mine]; 
    [mine release]; 
    } 
} 
    NSLog(@"created database successfully"); 
    sqlite3_finalize(compiledStatement); 
} 
sqlite3_close(database); 
    } 
- (void)applicationDidFinishLaunching:(UIApplication *)application { 
    databaseName = @"MinesoftheMotherLode.sql"; 
    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDir = [documentPaths objectAtIndex:0]; 
databasePath = [documentsDir stringByAppendingPathComponent:databaseName]; 
[self checkAndCreateDatabase]; 
[self readMinesFromDatabase]; 
MainViewController *aController = [[MainViewController alloc] initWithNibName:@"MainView" bundle:nil]; 
self.mainViewController = aController; 
[aController release]; 
    mainViewController.view.frame = [UIScreen mainScreen].applicationFrame; 
[window addSubview:[mainViewController view]]; 
    [window makeKeyAndVisible]; 
} 

實現文件是在這裏:

#import "Mine.h" 
@implementation Mine 
@synthesize entryNumber, mineName, mineType, status, latitudeInitial, longitudeInitial, metal, display, coverRegion; 
-(id)initWithEntryNumber:(NSNumber *)e mineName:(NSString *)n mineType:(NSString *)t status:(NSString *)s latitudeInitial:(NSNumber *)l longitudeInitial:(NSNumber *)o metal:(NSString *)m display:(BOOL *)d coverRegion:(NSNumber *)c 
{ 
self.entryNumber = e; 
self.mineName = n; 
self.mineType = t; 
self.status = s; 
self.latitudeInitial = l; 
self.longitudeInitial = o; 
self.metal = m; 
self.display = d; 
self.coverRegion = c; 
return self; 
} 
@end 

的NSLog的「第二if語句初始化」沒有顯示在控制檯上的。關於需要在這裏修正什麼的任何想法?是的,我知道,我應該使用核心數據。

+0

如果一切保持運行,並且不顯示第二日誌信息,這意味着如果語句失敗(sqlite3_prepare_v2 (...)!= SQLITE_OK)。添加一個else語句並查看sqlite3_errmsg(...)必須說的話。首先,你確定你的表名是正確的嗎?你確定你的數據庫實際上被複制了嗎?等等... – 2010-01-14 20:15:55

+0

我發現了一個sql錯誤表,可能對其他人需要幫助這個問題很有用:http://www.sqlite.org/c_interface.html,但我將如何去查看價值的sqlite3_prepare ...?我試圖在NSLog中顯示它,但它不工作。 – 2010-01-14 20:42:59

+0

好吧,所以我得到它加載,但現在它崩潰,並給我一個「由於未捕獲的exeption termnating應用程序」*** + [NSString stringWithUTF8String:]:NULL cString' – 2010-01-14 21:41:58

回答

0

看來你已經回答了關於它加載的最初問題。您就有關空字符串的二次碰撞的問題,您應該是裝載這樣的字符串:

if (sqlite3_column_text(init_statement, 0) != NULL) { 
    self.someString = [NSString stringWithUTF8String:(char *)sqlite3_column_text(init_statement, 0)]; 
} else { 
    self.someString = @""; 
} 
+0

只是爲了澄清,」someString「對我來說就像amineType是正確的?我可以使用這個代碼來代替每個NSString * asomeThing = [NSString ..(init_statement,0)];? – 2010-01-14 22:54:28

+0

是的。將'self.someString'替換爲'self.amineType'或任何其他變量,並確保將正確的列放在我提供的代碼的第一行和第二行中。 你也不需要像這樣對雙列進行檢查,從我所見過的。 – mjdth 2010-01-14 23:08:42

+0

好吧,當我爲所有的字符串加載實現這個時,我得到了幾個錯誤:init_statement未聲明(首次在函數中使用),self.amineName帶來了錯誤:成員胺的請求不是結構或聯合,最後所有的字符串變量說它們是未聲明的,首先在對象「我的」被定義的部分中使用函數。 – 2010-01-14 23:36:34