2010-11-30 15 views
1

iPhone 개발자로서의 기술을 쌓으려고하고 있으며 현재 SQLite 데이터베이스를 사용하고 있습니다.SQLite 데이터베이스에서 결과를 검색 할 수 없습니다.

- (void)viewDidLoad { 
[super viewDidLoad]; 

GroceryList1AppDelegate *appDelegate = (GroceryList1AppDelegate *)[[UIApplication sharedApplication] delegate]; 

self.results = [appDelegate.database executeSqlWithParameters:@"SELECT * from GroceryItem where number < ?", [NSNumber numberWithInt:6], nil]; 

} 

내 executeSqlWithParameters() 메소드는 다음과 같습니다

- (void)applicationDidFinishLaunching:(UIApplication *)application {  

    self.database = [[[ISDatabase alloc] initWithFileName:@"TestDB.sqlite"] autorelease]; 

if(![[database tableNames] containsObject:@"GroceryItem"]) { 

    [database executeSql:@"create table GroceryItem(primaryKey integer primary key autoincrement, name text NOT NULL, number integer NOT NULL)"]; 
    [database executeSql:@"insert into GroceryItem (name, number) values ('apples', 5)"]; 
    [database executeSql:@"insert into GroceryItem (name, number) values ('oranges', 3)"]; 

} 

[window addSubview:navigationController.view]; 
[window makeKeyAndVisible]; 

} 

내 RootViewController.m 클래스의 SQL 호출을 내 GroceryListAppDelegate.m 클래스에서 다음과 같이 내가 SQLite는 테이블을 만들었습니다 : 내가 구축하고 내 코드를 실행하면

- (NSArray *) executeSql:(NSString *)sql withParameters: (NSArray *) parameters { 

NSMutableDictionary *queryInfo = [NSMutableDictionary dictionary]; 
[queryInfo setObject:sql forKey:@"sql"]; 

if (parameters == nil) { 

    parameters = [NSArray array]; 

} 

//we now add the parameters to queryInfo 

[queryInfo setObject:parameters forKey:@"parameters"]; 

NSMutableArray *rows = [NSMutableArray array]; 

//log the parameters 

if (logging) { 

    NSLog(@"SQL: %@ \n parameters: %@", sql, parameters); 

} 

sqlite3_stmt *statement = nil; 

if (sqlite3_prepare_v2(database, [sql UTF8String], -1, &statement, NULL) == SQLITE_OK) { 

    [self bindArguments: parameters toStatement: statement queryInfo: queryInfo]; 

    BOOL needsToFetchColumnTypesAndNames = YES; 
    NSArray *columnTypes = nil; 
    NSArray *columnNames = nil; 

    while (sqlite3_step(statement) == SQLITE_ROW) { 

     if (needsToFetchColumnTypesAndNames) { 

      columnTypes = [self columnTypesForStatement:statement]; 
      columnNames = [self columnNamesForStatement:statement]; 
      needsToFetchColumnTypesAndNames = NO; 

     } 

     id row = [[NSMutableDictionary alloc] init]; 
     [self copyValuesFromStatement:statement toRow:row queryInfo:queryInfo columnTypes:columnTypes columnNames:columnNames]; 
     [rows addObject:row]; 
     [row release]; 

    }  

} 

else { 

    sqlite3_finalize(statement); 
    [self raiseSqliteException:[[NSString stringWithFormat:@"failed to execute statement: '%@', parameters: '%@' with message: ", sql, parameters] stringByAppendingString:@"%S"]]; 

} 

sqlite3_finalize(statement); 
return rows; 

} 

, 나는 아무 결과, 사실, 내 SQL 호출을 주어 졌을 때, 내 목록에 사과, 오렌지를 얻을해야 얻을. 그러나, 나는이 내 SQL 코드를 수정 : 다른 메소드를 호출

self.results = [appDelegate.database executeSql:@"SELECT * from GroceryItem"]; 

을 : executeSql() : 사과, 오렌지 :

- (NSArray *) executeSql: (NSString *)sql { 

return [self executeSql:sql withParameters: nil]; 

} 

을이 경우에, 나는 결과를 치울 . 왜 이런거야? 내가 도대체 ​​뭘 잘못하고있는 겁니까? 왜 SQL 호출에서 결과를 얻는 것이지 다른 SQL 호출에서 결과를 얻지 못하는 것입니까?

답변

0

많은 도움을 주셔서 감사합니다.하지만 해결책을 찾았습니다. 나는 숫자에 대한 바인드 문을했다

- (void) bindArguments: (NSArray *) arguments toStatement: (sqlite3_stmt *) statement queryInfo: (NSDictionary *) queryInfo { 

권리 :

else if ([argument isKindOfClass:[NSNumber class]]) 
     { 
      sqlite3_bind_double(statement, -1, [argument doubleValue]); 
     } 

내가 변경하려면 -1 난에 필요한 문제는 내 bindArguments에서() 함수이다. 이 변수는 SQL 문에 어떤 변수를 포기할 것인지를 SQL에 알려줍니다. 그래서이 경우에 우리는 오직 하나의 변수를 나타냅니다? 5로 대체해야합니다.

0

시뮬레이터 나 장치에서 .sqlite 파일을 추출하고 sqlite3을 사용하여 명령 줄에서 열 경우 쿼리가 작동합니까? 이렇게하면 데이터베이스 생성 코드와 쿼리 코드의 테스트를 분리 할 수 ​​있습니다.

+0

답장을 보내 주셔서 대단히 감사합니다. 하지만 시뮬레이터에서 .sqlite 파일을 어떻게 추출하고 sqlite3을 사용하여 명령 줄에서 열 수 있습니까? 도와 줘서 고마워. – syedfa

관련 문제