Код обходит цикл создания массива из базы данных sqlite - PullRequest
0 голосов
/ 14 января 2010

мой код создания NSMutableArray по какой-то причине вообще игнорируется теоретически предполагается создать 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];
}

Файл реализации для Mines находится здесь:

#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 initialized» не отображается на консоли. какие-либо идеи относительно того, что должно быть исправлено здесь? и да, я знаю, я должен использовать основные данные.

1 Ответ

0 голосов
/ 15 января 2010

Кажется, вы ответили на свой первоначальный вопрос о загрузке. Для вашего дополнительного вопроса, касающегося сбоя в отношении пустой строки, вы должны загружать строки, подобные этой:

if (sqlite3_column_text(init_statement, 0) != NULL) {
    self.someString = [NSString stringWithUTF8String:(char *)sqlite3_column_text(init_statement, 0)];
} else {
    self.someString = @"";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...