FMDB Result set ruturning nil - PullRequest
       7

FMDB Result set ruturning nil

1 голос
/ 22 июня 2011

Итак, вот в чем дело, я использую FMDB SQLite Wrapper для своего приложения БД.Я знаю, что есть Cord Data, но моя база данных действительно огромна, и все, что я хочу сделать, это прочитать ее.Никакие новые записи не будут вставлены / обновлены через приложение iOS.В какой-то момент в этом приложении я пытаюсь извлечь записи из БД, которые представляют собой имя игрока и их идентификатор на основе searchTerm и searchPosition.searchTerm работает отлично.Запрос searchPosition работает в sqlite3, но не в приложении iOS.Я не знаю, где я иду не так.Помоги мне.Код для обоих методов следующий:

-(IBAction)searchTerm
{
searchTermValue=self.term.text;
self.fmdbUtils = [[[FMDBUtils alloc] initWithDatabase:@"Colts.sql"] autorelease];
FMDatabase *db = [self.fmdbUtils sharedDB];
FMResultSet *rs = nil;
NSString *AgentId = nil;
NSString *PlayerName = nil;
NSString *PlayerId = nil;
ScoutAppDelegate *appDelegate = (ScoutAppDelegate *)[[UIApplication sharedApplication] delegate];
appDelegate.playerList = [[NSMutableArray alloc] init];

NSString * query = @"SELECT * FROM Player WHERE LENGTH (lastname)>0 AND LENGTH (firstname)>0 AND ( lastname LIKE '%' || ? || '%' OR firstname LIKE'%' || ? || '%' OR Height LIKE '%' || ? || '%' OR Weight LIKE '%' || ? || '%') ORDER BY lastname,firstname";
rs = [db executeQuery:query,searchTermValue,searchTermValue,searchTermValue,searchTermValue];
[query release];

while([rs next]) 
{
    PlayerId = [rs stringForColumn:@"player_id"];
    //NSString *PlayerName = [rs stringForColumn:@"Player Name"];
    if ([rs stringForColumn:@"Player Name"]!= NULL) 
    {
        PlayerName = [rs stringForColumn:@"Player Name"];
    }
    else
        PlayerName=@"";
    if ([rs stringForColumn:@"agent_id"]!= NULL) 
    {
        AgentId = [rs stringForColumn:@"agent_id"];
    }
    else
        AgentId=@"0";

    Player *temp =[[Player alloc]initPlayerID:PlayerId Name:PlayerName Agent:AgentId];
    [appDelegate.playerList addObject:temp];
    [temp release];
}
[rs close];
[db close];


PlayersListTableViewController *temp=[[PlayersListTableViewController alloc]initWithNibName:@"PlayersListTableViewController" bundle:nil];
temp.title=@"Players";
self.playersListTableViewCtrl=temp;
[temp release];

[self.navigationController pushViewController:playersListTableViewCtrl animated:YES];
}

Вот действие, которое используется для поиска игроков на основе их игровой позиции.

-(IBAction)SearchPosition
{
searchTermValue= searchPositionValue;
self.fmdbUtils = [[[FMDBUtils alloc] initWithDatabase:@"Colts.sql"] autorelease];
FMDatabase *db = [self.fmdbUtils sharedDB];
FMResultSet *rs =  nil;
NSString *AgentId = nil;
NSString *PlayerName = nil;
NSString *PlayerId = nil;
ScoutAppDelegate *appDelegate = (ScoutAppDelegate *)[[UIApplication sharedApplication] delegate];
//appDelegate.playerList = [[NSMutableArray alloc] init];

NSString * query = @"SELECT * FROM Player WHERE LENGTH (lastname)>0 AND LENGTH (firstname)>0 AND ( College_Position LIKE '%' || ? || '%' OR Pro_Position LIKE'%' || ? || '%') ORDER BY lastname,firstname";
rs = [db executeQuery:query,searchPositionValue,searchPositionValue];
[query release];

while([rs next]) 
{
    PlayerId = [rs stringForColumn:@"player_id"];
    //NSString *PlayerName = [rs stringForColumn:@"Player Name"];
    if ([rs stringForColumn:@"Player Name"]!= NULL) 
    {
        PlayerName = [rs stringForColumn:@"Player Name"];
    }
    else
        PlayerName=@"";
    if ([rs stringForColumn:@"agent_id"]!= NULL) 
    {
        AgentId = [rs stringForColumn:@"agent_id"];
    }
    else
        AgentId=@"0";

    Player *temp =[[Player alloc]initPlayerID:PlayerId Name:PlayerName Agent:AgentId];
    [appDelegate.playerList addObject:temp];
    [temp release];
}
[rs close];
[db close];

PlayersListTableViewController *temp=[[PlayersListTableViewController alloc]initWithNibName:@"PlayersListTableViewController" bundle:nil];
temp.title=@"Players";
self.playersListTableViewCtrl=temp;
[temp release];

[self.navigationController pushViewController:playersListTableViewCtrl animated:YES];
}

Этот метод просто дает выбранную игровую позицию для поиска в окне выбора..

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component{
self.searchPositionValue = [playingPositions objectAtIndex: row];
}

1 Ответ

8 голосов
/ 21 июля 2011

Попробуйте отладить оператор SQL (после вызова executeQuery:), напечатав ошибку:

if ([db hadError]) {
  NSLog(@"DB Error %d: %@", [db lastErrorCode], [db lastErrorMessage]); 
}

Для разработки я бы рекомендовал включить общую регистрацию ошибок:

db.logsErrors = YES;
...