2010-01-14 28 views
0

Mon code de création NSMutableArray est en train d'être contourné pour une raison quelconque. en théorie, il est supposé créer un NSMutableArray basé sur une base de données sqlite. Il n'y a qu'un seul message d'avertissement et aucune erreur. Qu'est-ce que je rate? le fichier de mise en œuvre est:Le code contourne la création d'un tableau Boucle à partir d'une base de données 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]; 
} 

Le fichier de mise en œuvre des mines est ici:

#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 

Le NSLog "deuxième instruction if initialisé" n'apparaît pas sur la console. des idées sur ce qui doit être réparé ici? et oui je sais, je devrais utiliser des données de base.

+0

Si tout continue à fonctionner et le second message de journal n'est pas affiché, cela signifie que l'instruction if a échoué (sqlite3_prepare_v2 (...)! = SQLITE_OK). Ajoutez une autre instruction et voyez ce que sqlite3_errmsg (...) a à dire. D'une part, êtes-vous sûr que le nom de votre table est correct? Êtes-vous sûr que votre base de données a été copiée? Etc ... –

+0

J'ai trouvé une table avec des erreurs sql qui peuvent être utiles pour toute personne ayant besoin d'aide avec cette question: http: //www.sqlite.org/c_interface.html, mais comment pourrais-je voir la valeur de la sqlite3_prepare ...? J'ai essayé de l'afficher dans NSLog mais ça ne fonctionne pas. –

+0

ok donc je l'ai eu à charger, mais maintenant il se bloque, et me donne une "app de résiliation en raison de l'exeption uncaught" *** + [NSString stringWithUTF8String:]: NULL cString ' –

Répondre

0

Il semble que vous avez répondu à votre question initiale sur le chargement. Pour votre question secondaire concernant l'accident de la chaîne vide, vous devez être des chaînes de chargement comme ceci:

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

juste pour clarifier," someString "pour moi serait comme amineType correct? Puis-je utiliser ce code à la place de chaque NSString * asomeThing = [NSString .. (init_statement, 0)] ;? –

+0

Oui exactement. Remplacez 'self.someString' par' self.amineType' ou toute autre variable et assurez-vous de mettre la bonne colonne dans les deux premières lignes du code que j'ai fourni. Aussi, vous n'avez pas besoin de faire un chèque comme celui-ci pour les colonnes doubles, d'après ce que j'ai vu. – mjdth

+0

ok J'obtiens plusieurs erreurs quand j'implémente ceci pour toutes les charges de chaînes: init_statement undeclared (première utilisation dans la fonction), self.amineName affiche l'erreur: request for member amineName pas une structure ou une union, et enfin toutes les variables de chaîne disent qu'ils ne sont pas déclarés, d'abord utilisés en fonction pendant la partie où l'objet "mine" est défini. –