1

これが契約です。DBアプリにFMDB SQLite Wrapperを使用しています。Cord Data があることは知っていますが、私のデータベースは非常に巨大で、それを読み取るだけです。iOS アプリを介して新しいレコードが挿入/更新されることはありません。このアプリのある時点で、searchTerm と searchPosition に基づいてプレーヤーの名前と ID である DB からレコードを取得しようとしています。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 です。

-(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];
}
4

1 に答える 1

8

エラーを出力して、(executeQuery: 呼び出しの後) SQL ステートメントのデバッグを試みます。

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

開発のために、エラーの一般的なログを有効にすることをお勧めします:

db.logsErrors = YES;
于 2011-07-21T12:47:35.570 に答える