[C] sqlite database geeft tweede column niet terug.

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • ZpAz
  • Registratie: September 2005
  • Laatst online: 11-09 21:48
Voor de iPhone ben ik met een hobbyprojectje bezig, en nu heb ik daar een sqlite database bij nodig. Daarvoor heb ik de volgende structuur in de database gemaakt:

Afbeeldingslocatie: http://localhostr.com/files/a4a394/Screen+shot+2010-03-03+at+13.09.08.png

Er zitten twee rijen in de database:

Afbeeldingslocatie: http://localhostr.com/files/c7caa2/Screen+shot+2010-03-03+at+13.18.35.png

Heel erg simpel dus.

Nu als ik de select query uitvoer, krijg ik ook twee rijen en twee kolommen terug. Maar de waarde van de tweede kolom komt altijd op null uit?

Als ik de volgende code heb:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
//Statement
        const char *sql = "SELECT `id`, `name` FROM testaments ORDER BY `id`";
        sqlite3_stmt *selectStatement;
        //Execute statement
        int returnValue = sqlite3_prepare_v2(database, sql, -1, &selectStatement, NULL);

if(returnValue == SQLITE_OK) {
            while(sqlite3_step(selectStatement) == SQLITE_ROW) { //While there are rows
                
                //ID collumn
                NSLog(@"ID of row: %i", sqlite3_column_int(selectStatement, 0));
                //Name collumn
                
                //Name of collumn
                NSLog(@"Name of collumns in row: %@", [NSString stringWithUTF8String:(char *) sqlite3_column_name(selectStatement, 1)]);
                //Contents of collumn 'name'
                char *pointer = (void *)sqlite3_column_int(selectStatement, 1);
                if (pointer == NULL)
                    NSLog(@"Contents of row 'name': NULL"); 
                else {
                    NSLog(@"Contents or row 'name': %@", [NSString stringWithUTF8String:pointer]);
                }
                
            }
        }


Dan is dit de output:
2010-03-03 13:19:07.002 Bijbel[2354:207] ID of row: 1
2010-03-03 13:19:07.003 Bijbel[2354:207] Name of collumns in row: name
2010-03-03 13:19:07.004 Bijbel[2354:207] Contents of row 'name': NULL
2010-03-03 13:19:07.005 Bijbel[2354:207] ID of row: 2
2010-03-03 13:19:07.005 Bijbel[2354:207] Name of collumns in row: name
2010-03-03 13:19:07.006 Bijbel[2354:207] Contents of row 'name': NULL
2010-03-03 13:19:07.006 Bijbel[2354:207] Number of testaments: 0
Ik krijg van de kolom 'id' dus wel het juiste veld-waarde terug, ook is de kolom 'name' aanwezig, maar daarvan krijg ik niet de juiste waarde terug? (Altijd null).

Weet iemand waar dit aan ligt.

[ Voor 5% gewijzigd door ZpAz op 03-03-2010 13:23 . Reden: Select statement toegevoegd, wel zo makkelijk ]

Tweakers Time Machine Browser Extension | Chrome : Firefox


Acties:
  • 0 Henk 'm!

  • PvdE
  • Registratie: April 2009
  • Laatst online: 09-09 21:46
Nu ben ik niet echt bekend met sqlite, maar moet je op regel 17 niet iets gebruiken als sqlite3_column_text in plaats van sqlite3_column_int?

Acties:
  • 0 Henk 'm!

  • ZpAz
  • Registratie: September 2005
  • Laatst online: 11-09 21:48
De functie sqlite3_column_int geeft de waarde van de colum terug waar het opgegeven nummer gelijk is aan het 'nummer' van de kolom. Beginnende bij nul.

Dus kolom 0 zal in dit geval de waarde val kolom 'id' teruggeven, en kolom 1 de waarde van de tweede kolom namelijk 'name' teruggeven.

Tweakers Time Machine Browser Extension | Chrome : Firefox


Acties:
  • 0 Henk 'm!

  • PvdE
  • Registratie: April 2009
  • Laatst online: 09-09 21:46
dat klopt ongetwijfeld, maar aangezien dat sqlite_column_int een int terug geeft, en je een tekst veld opvraagt lijkt het me niet meer dan logisch dat je daar de functie een andere functie voor moet gebruiken. Namelijk eentje die je tekst retourneert en geen int.

tenminste als ik de documentatie correct hebt geïnterpreteerd, http://www.sqlite.org/c3ref/column_blob.html » const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol);

Acties:
  • 0 Henk 'm!

  • leuk_he
  • Registratie: Augustus 2000
  • Laatst online: 15-07 15:35

leuk_he

1. Controleer de kabel!

ZpAz schreef op woensdag 03 maart 2010 @ 13:50:
De functie sqlite3_column_int geeft de waarde van de colum terug waar het opgegeven nummer gelijk is aan het 'nummer' van de kolom. Beginnende bij nul.

Dus kolom 0 zal in dit geval de waarde val kolom 'id' teruggeven, en kolom 1 de waarde van de tweede kolom namelijk 'name' teruggeven.
Ja, maar je hebt er toch een tekst in gestopt, geen int?

const unsigned char *sqlite3_column_text


Heel simpele test: stop een getal in "name" (b.v. 1234) en werkt het dan wel?

Lees anders de waarde van SQLITE_ERROR ook eens uit.

Need more data. We want your specs. Ik ben ook maar dom. anders: forum, ff reggen, ff topic maken
En als je een oplossing hebt gevonden laat het ook ujb ff in dit topic horen.


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 04:30
Volgens mij slaat PvdE de spijker op z'n kop. Op de gelinkte pagina wordt ook uitgelegd dat je een waarde van type text wel kunt opvragen als int, maar dan wordt de tekst geconverteerd met atoi(), wat in dit geval dus 0 oplevert. Als je die 0 vervolgens cast naar een (char*) krijg je inderdaad een NULL pointer.

Acties:
  • 0 Henk 'm!

  • ZpAz
  • Registratie: September 2005
  • Laatst online: 11-09 21:48
Okee, hmm, de pagina waarweg ik de documentatie weg had was niet geheel duidelijk daarin blijkbaar.. Ook heb ik inderdaad de error proberen uit te lezen, maar die gaaf steeds aan dat er geen error was.

Beetje domme fout van me blijkbaar. In ieder geval bedankt, ik ben er uit.

[ Voor 3% gewijzigd door ZpAz op 03-03-2010 15:04 ]

Tweakers Time Machine Browser Extension | Chrome : Firefox


Acties:
  • 0 Henk 'm!

  • pascalw
  • Registratie: Februari 2008
  • Laatst online: 05-09 20:23
Los van dit probleem zou je eens kunnen kijken naar FMDatabase, dat is een dunne objective-C wrapper om de sqlite C interface heen, dan hoef je tegen dit soort problemen niet aan te lopen.

Acties:
  • 0 Henk 'm!

  • ZpAz
  • Registratie: September 2005
  • Laatst online: 11-09 21:48
Dat kan in de toekomst wel eens handig zijn inderdaad, bedankt :)

Tweakers Time Machine Browser Extension | Chrome : Firefox

Pagina: 1