sql >> Database >  >> RDS >> SQLite

als mijn tabel 4 kolommen heeft en ik wil de 3e kolom ophalen, wat moet ik dan doen.

Het belangrijkste aspect is niet de tabel of tabellen, maar de zoekopdracht zelf, aangezien die de kolomvolgorde bepaalt.

Als de zoekopdracht bijvoorbeeld was gebaseerd op SELECT * FROM your_table (en de kolommen in de tabel zijn gedefinieerd als id, songname, songyear, songpath) dan is de kolom in de kolom de cursor volgens de definitie.

Als u echter SELECT songname, songpath, songid, songyear FROM your_table; deed

De volgorde zou zijn volgens de SELECT statement, d.w.z. songnaam (0), songpath (1), songid (2), songyear (3).

Dat is echter een van de problemen met het gebruik van offsets, je bent gebonden aan de volgorde volgens de SELECT.

Als u nu de getColumnIndex . van de cursor gebruikt methode dan die de kolomoffset retourneert volgens zijn naam.

Dus cursor.getString(cursor.getColumnIndex("songpath")); zou de songpath-kolom krijgen, ongeacht de offset/positie in de cursor (ALS DE CURSOR DIE KOLOM BEVAT).

Herinnerend aan je vorige vraag had je eigenlijk SELECT songpath FROM your_table , Als zodanig is er slechts een enkele kolom in de resulterende cursor, dus u kunt alleen get gebruiken:-

cursor.getString(0); 

of:-

cursor.getString(cursor.getColumnIndex("songpath"));

De laatste is de aanbevolen methode (MAAR laat de kolomnamen idealiter als constanten definiëren)

Zaken kunnen echter ingewikkelder worden, denk bijvoorbeeld aan

SELECT songpath||songname AS myconfusingcolumn FROM yourtable;

Dit zou een enkele kolom retourneren met de naam myconfusingcolumn die bestaat uit het songpad aaneengeschakeld met de songnaam. Dat wil zeggen dat het AS-sleutelwoord wordt gevolgd door een alias voor de kolom (zonder de AS zou de kolomnaam nog verwarrender/moeilijker zijn omdat het songpath||songname zou zijn) (dit voorbeeld is relatief eenvoudig).

Een ander ding om op te letten is, zijn dubbelzinnig kolommen (dubbele kolomnamen) bijvoorbeeld, als u twee tabellen had song en artiest en song de extra kolom artist_id zodat u:-

Het lied tabel met kolommen id , naam van het nummer , liedjaar , songpad , artist_id

De artiesten tabel met kolommen id en artiest_name

en je gebruikte toen

SELECT * FROM song JOIN artist ON song.artist_id = artist.id;
  • Merk op dat als de id kolom van de artiest table, indien gebruikt in de instructie, moet het worden voorafgegaan door de respectieve tabelnaam, anders zou er een AMBIGUOUUS kolomfout optreden, d.w.z. de SQL-parser zou niet weten welke id kolom bedoel je.

Verder zou je eindigen met een cursor met kolommen:-

id , songname, songyear, songpath, artist_id, id , artiestnaam

csr.getLong(csr.getColumnIndex("id")); could get confused (I believe it actually gets the last AMBIGUOUS column)

long songid = csr.getLong(0); would get the id column from the song table.
long artistid = csr.getLong(5); would get the id column from the artist table.
long artistid = csr.getLong(4); would also get the artist_id same as (5).

Om samen te vatten/samen te vatten:-

De kolommen, volgorde en naam in een cursor zijn volledig afhankelijk van de SELECT-query. Ze hebben een offset en naam volgens de zoekopdracht. Bij toegang tot de cursor zijn de onderliggende tabelnaam(en) niet bruikbaar, alleen de kolomnamen of offsets.

Het is flexibeler om kolommen op naam te openen in plaats van op hun plaats . Dat is gebruik maken van de getColumnIndex . van de cursor methode omdat het de noodzaak om offsets te berekenen teniet doet en meer in het bijzonder het missen van herberekening als een query wordt gewijzigd.

Het gebruik van CONSTANTS voor kolomnamen zal waarschijnlijk leiden tot minder problemen zoals typefouten.

Aanvullend

Met behulp van Toast.makeText(this, mListSongs+"", Toast.LENGTH_SHORT).show();

Krijgt het ongebruikelijke resultaat [{}] omdat mlistSongs de volledige container voor de nummers is. U moet door elk element lopen en vervolgens de eigenschappen/waarden voor elk lid/variabele uit het element (Song-object) halen.




  1. Op SQLite-expressie gebaseerde index

  2. Hoe de databasenauwkeurigheid te verbeteren

  3. Onbeantwoorde vragen over MS SQL Server-beveiliging en toegangscontrole

  4. maak een aangepaste functie voor datumverschil met uitzondering van weekends en feestdagen in oracle sql