iCulture forum | iPhone, iPad,  iPod touch, Apple TV en iOS

iCulture forum | iPhone, iPad, iPod touch, Apple TV en iOS (https://forum.iculture.nl/)
-   Ontwikkelen voor iOS (https://forum.iculture.nl/f133/development/f58/ontwikkelen-voor-ios/)
-   -   Meerdere arrays uit SQLite DB (https://forum.iculture.nl/f133/development/f58/ontwikkelen-voor-ios/90151-meerdere-arrays-sqlite-db.html)

DJ14 30-04-11 11:08

Meerdere arrays uit SQLite DB
 
Ola!

Een nieuwe app die ik aan het maken ben leest gegevens uit een SQLite database en moet deze in een tableview tonen. Nu bestaat de database uit een aantal rijen, met per rij 6 kolommen. Nu wil ik dat als een kolom in een rij de string "Nederland" bevat, deze rij wordt toegevoegd aan de array "arrayNederland", en dat als een kolom in een rij de string "Spanje" bevat, deze rij wordt toegevoegd aan de array "arraySpanje", etc. De gegevens worden dus uit de database gehaald en gesorteerd op land, zoals een specifieke kolom dat aangeeft. De vraag is alleen hoe doe ik dit? Vervolgens wordt er per section een verschillende array gebruikt in de tableview, maar dit is eenvoudig. Tot zover werkt het prima met het lezen van de data uit de database, alleen het sorteren moet nog komen.

Samengevat:
1) pak alle rijen
2) lees 2e kolom van elke rij
3) ALS 2e kolom "Nederland" bevat, voeg de rij waar deze kolom in staat dan toe aan de array "arrayNederland"

Tot zover heb ik deze code voor het lezen van de data:

Code:

-(void)readDataFromDatabase {
        // Setup the database object
        sqlite3 *database;
       
        // Init the animals Array
        dataobjects = [[NSMutableArray alloc] init];
       
        // Open the database from the users filessytem
        if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) {
                // Setup the SQL Statement and compile it for faster access
                const char *sqlStatement = "SELECT * FROM premium";
                sqlite3_stmt *compiledStatement;
                if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) {
                        // Loop through the results and add them to the feeds array
                        while(sqlite3_step(compiledStatement) == SQLITE_ROW) {
                                // Read the data from the result row
                                NSString *aCity = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 1)];
                                NSString *aState = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 2)];
                                NSString *aStreet = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 3)];
                                NSString *aZipcode = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 4)];
                                NSString *aPhonenumber = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 5)];
                                NSString *aDescription = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 6)];
                               
                                // Create a new data object with the data from the database
                                DataObj *dataobj = [[DataObj alloc] initWithName:aCity state:aState street:aStreet zipcode:aZipcode phonenumber:aPhonenumber description:aDescription];
                               
                                // Add the data object to the data Array
                               
                               
                                [dataobjects addObject:outlet];
                               
                                [dataobjects release];
                        }
                }
                // Release the compiled statement from memory
                sqlite3_finalize(compiledStatement);
               
        }
        sqlite3_close(database);
       
}


DJ14 01-05-11 10:42

Aangezien het haast heeft doe ik het nu op een iets andere manier (naar mijn idee is deze manier slechter omdat het aantal rijen telkens handmatig moet worden ingesteld bij verandering van aantal rijen in tableview). Wat ik nu heb is de volgende SQL query waardoor alles al gesorteerd wordt op land:

Code:

const char *sqlStatement = "SELECT * FROM premium ORDER BY state ASC";
Maar nu het volgende: hoe splits ik 1 enkele array in meerdere secties in een tableview? Alvast bedankt.

DJ14 01-05-11 17:21

lol, het is me gelukt een enkele array te splitsen in een tableview door onderstaand te doen:

Code:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
if(indexPath.section == 0){
                DataObject *data1 = (DataObject *)[appDelegate.array objectAtIndex:indexPath.row];
                cell.textLabel.text = data1.name;
        }
        if(indexPath.section == 1){
                DataObject *data2 = (DataObject *)[appDelegate.array objectAtIndex:indexPath.row + 10];
                cell.textLabel.text = data2.name;
        }
        if(indexPath.section == 2){
                DataObject *data3 = (DataObject *)[appDelegate.array objectAtIndex:indexPath.row + 11];
                cell.textLabel.text = data3.name;
        }

// en zo de hele tijd verder
        return cell;
}

Nu heb ik een functie geschreven die de SQL database afleest en het aantal keer dat een rij met "Nederland" voorkomt, het aantal keer dat een rij met "Spanje" voorkomt, etc. Dit werkt prima, een klein stukje van die functie hieronder (deze functie staat in de appdelegate):

Code:

- (int)getCountryCount:(NSString*)hetLand
{
    int count = 0;
       
//hier de database uitlezen met sql query in vorige post
       
        //NSLog(@"num = %i", count);

    return count;
}

Nu wil ik vanuit de AppDelegate het resultaat van de getCountryCount code doorgeven naar de class met de uitableview. Dat doe ik als volgt (onderstaande code staat in de didFinishLaunchingWithOptions methode van de appdelegate:

Code:


ClassMetTableView *cmtv = [[ClassMetTableView alloc] init];
        int nederlandCount = [[self performSelector:@selector(getCountryCount:) withObject:@"Nederland"] intValue];
        [cmtv setCountryCount:nederlandCount];
        int duitslandCount = [[self performSelector:@selector(getCountryCount:) withObject:@"Duitsland"] intValue];
        [cmtv setDuitslandCount:duitslandCountCount];
        int spanjeCount = [[self performSelector:@selector(getCountryCount:) withObject:@"Spanje"] intValue];
        [cmtv setSpanjeCount:spanjeCount];

Verder zijn de variabelen die zich in de ClassMetTableView bevinden gedeclareerd in ClassMetTableView.h op de volgende manier:

Code:

@interface ClassMetTableView : UITableViewController <UITableViewDelegate, UITableViewDataSource> {
       
        NSInteger NederlandCount;
        NSInteger DuitslandCount;
        NSInteger SpanjeCount;
}
@property (nonatomic, assign) NSInteger CaliforniaCount;
@property (nonatomic, assign) NSInteger ConnecticutCount;
@property (nonatomic, assign) NSInteger FloridaCount;

En in ClassMetTableView.m:

Code:

@synthesize NederlandCount, DuitslandCount, SpanjeCount;
En verder nog in ClassMetTableView.m:
Code:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{

        if(section == 0)
        return NederlandCount;
        if(section == 1)
        return DuitslandCount;
        if(section == 2)
        return SpanjeCount;
        // etc;
}

Het probleem is nu alleen dat de app crasht zodra deze opstart (hij start niet eens op). In de Console wordt geen melding gemaakt van de crash, ik denk dat er ergens iets niet goed gaat met het geheugen. Iemand die me verder kan helpen? Alvast bedankt!

DJ14 02-05-11 10:05

Opgelost, getCountryCount functie verplaatst naar ClassMetTableView.m. Gelijk verdwenen hiermee een hoop waarschuwingen :d


Alle tijden zijn GMT +2. Het is nu 19:06.