sql >> Base de Datos >  >> RDS >> SQLite

si mi tabla tiene 4 columnas y quiero buscar la tercera columna, ¿qué debo hacer?

El aspecto importante no es la tabla o tablas, sino la consulta en sí misma, ya que determina el orden de las columnas.

Por ejemplo, si la consulta se basara en SELECT * FROM your_table (y las columnas en la tabla se definieron como id, nombre de la canción, año de la canción, ruta de la canción), entonces la columna es el cursor según la definición.

Sin embargo, si SELECT songname, songpath, songid, songyear FROM your_table;

El orden sería según el SELECCIONAR declaración, es decir, nombre de la canción (0), ruta de la canción (1), id de la canción (2), año de la canción (3).

Sin embargo, ese es uno de los problemas con el uso de compensaciones que está vinculado al pedido según SELECT.

Ahora, si usaste el getColumnIndex del Cursor método que devuelve el desplazamiento de la columna de acuerdo con su nombre.

Entonces cursor.getString(cursor.getColumnIndex("songpath")); obtendría la columna de la ruta de la canción independientemente de su desplazamiento/posición en el Cursor (SI EL CURSOR INCLUYE ESA COLUMNA).

Recordando tu pregunta anterior, básicamente tenías SELECT songpath FROM your_table , Como tal, solo hay una sola columna en el Cursor resultante, por lo que solo puede usar get :-

cursor.getString(0); 

o :-

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

Este último es el método recomendado (PERO idealmente tener los nombres de columna definidos como constantes)

Sin embargo, las cosas pueden complicarse más, por ejemplo, considere

SELECT songpath||songname AS myconfusingcolumn FROM yourtable;

Esto devolvería una sola columna llamada myconfusingcolumn que consta de la ruta de la canción concatenada con el nombre de la canción. Es decir, la palabra clave AS va seguida de un alias para la columna (sin AS, el nombre de la columna sería aún más confuso/difícil, ya que sería ruta de la canción||nombre de la canción) (este ejemplo es relativamente simple).

Otra cosa a tener en cuenta es que son ambiguas columnas (nombres de columna duplicados), por ejemplo, si tuviera dos tablas, canción y artista, y canción, la columna adicional id_artista, por lo que tendría:-

La canción tabla con columnas id , nombre de la canción , año de la canción , ruta de canciones , id_artista

Los artistas tabla con columnas id y nombre_artista

y luego usaste

SELECT * FROM song JOIN artist ON song.artist_id = artist.id;
  • Tenga en cuenta que como id columna del artista tabla, si se usa en la declaración, debe tener el prefijo del nombre de la tabla respectiva; de lo contrario, se generaría un error de columna AMBIGUO, es decir, el analizador SQL no sabría qué id columna a la que te refieres.

Además, terminaría con un Cursor con columnas:-

identificación , nombre de la canción, año de la canción, ruta de la canción, id_artista, id , nombre_artista

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).

Para recapitular/resumir:-

Las columnas, el orden y el nombre en un Cursor dependen totalmente de la consulta SELECT. Tendrán un desplazamiento y un nombre según la consulta. Al acceder al Cursor, los nombres de las tablas subyacentes no se pueden usar, solo los nombres de las columnas o las compensaciones.

Es más flexible acceder a las columnas por sus nombres en lugar de por sus offstes . Eso es hacer uso del getColumnIndex del Cursor ya que niega la necesidad de calcular las compensaciones y, más especialmente, la falta de recálculo en caso de que se cambie una consulta.

El uso de CONSTANTES para los nombres de las columnas probablemente reducirá los problemas, como los errores tipográficos.

Adicional

Usando Toast.makeText(this, mListSongs+"", Toast.LENGTH_SHORT).show();

Obtendrá el resultado inusual [{}] porque mlistSongs es el contenedor completo para las canciones. Debe recorrer cada elemento y luego obtener las propiedades/valores para cada miembro/variable del elemento (objeto Canción).