Search code examples
objective-csqliteuipickerview

two PickerViews of a single Sqlite3 Database


I must be doing something wrong here. My SQLite database is working. However, I cannot seem to populate the tname into a picker view while the picked populates three text fields tname, latitude, and longitude.

Info: Two picker views that are independent from each other, they both read the same sqlite db.

#import "ViewController.h"

@interface ViewController ()
{
    NSMutableArray *array1;
    sqlite3 *towerDB;
    NSString *dbPathString;
}

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    //UIPickerView *pickerview1;
    //array1 = [[NSMutableArray alloc]init];
    [[self pickerview1]setDelegate:self];
    [[self pickerview1]setDataSource:self];

    [self displayTower];
}

 - (void)displayTower
 {
    array1 = [[NSMutableArray alloc] init];
    sqlite3_stmt *statement;

    if (sqlite3_open([dbPathString UTF8String], &towerDB)==SQLITE_OK) {
        [array1 removeAllObjects];

        NSString *querySql = [NSString stringWithFormat:@"SELECT * FROM TOWERS"];
        const char* query_sql = [querySql UTF8String];

        //  sqlite3_clear_bindings(statement);
        //   sqlite3_reset(statement);

        if (sqlite3_prepare(towerDB, query_sql, -1, &statement, NULL)==SQLITE_OK) // NOT OK
            //This Code works in a TableView!!
            //Will NOT work in a PickerView
        {
            while (sqlite3_step(statement)==SQLITE_ROW)
            {
                NSString *tname = [[NSString alloc]initWithUTF8String:(const char *)sqlite3_column_text(statement, 1)];
                NSString *latitude = [[NSString alloc]initWithUTF8String:(const char *)sqlite3_column_text(statement, 2)];
                NSString *longitude = [[NSString alloc]initWithUTF8String:(const char *)sqlite3_column_text(statement, 3)];
                // NSString *ds2 = [[NSString alloc]initWithUTF8String:(const char *)sqlite3_column_text(statement, 4)];
                NSString *PickerTower = [[NSString alloc] initWithFormat:@"%@", tname];
                NSString *lat1 = [[NSString alloc] initWithFormat:@"%@", latitude];
                NSString *long1 = [[NSString alloc] initWithFormat:@"%@", longitude];

                NSArray *array = [[NSArray alloc] initWithObjects:PickerTower, nil];
                [array1 addObject:array];
                NSLog(@"Lat/Long %@ / %@",  lat1, long1);
            }
        }
    }
}

#pragma mark Picker Data Source Methods

-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView            {
    //ONE Colume
    return 1;
}

-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component {
    //data view how many items?
    return [array1 count];
    // return [_array2 count];
}

#pragma mark Picker Delegate Methods

-(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component {
    return [array1 objectAtIndex:row];

    //return [self->array1 objectAtIndex:row];

    // array1 = [[NSMutableArray alloc] init];
}

-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
    long select = row;
    NSLog(@"PickerView %ld",  select);
}

@end

Solution

  • You have to changed this code in the method name displayTower and code lines -

    [array1 addObject:array];
     NSLog(@"Lat/Long %@ / %@",  lat1, long1);
    

    with -

    [array1 addObject:array];
     NSLog(@"Lat/Long %@ / %@",  lat1, long1);
    [[self pickerview1] reloadAllComponents];
    

    may be it will help you, or feel free.