2010-01-14 32 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