logo
Bienvenido visitante. Para activar todas las funcionalidades, por favor Iniciar sesión o Registrarse.

Aviso

Icon
Error

Opciones
Ir a la última publicación
Doradiolly  
#1 Publicado : jueves, 7 de noviembre de 2013 13:33:40(UTC)
Doradiolly

Posición: Member

Grupos: Registered
Registrado: 06/10/2013(UTC)
Mensajes: 28

Agradecimientos: 1 veces
Fue agradecido: 3 vez/veces in 2 publicación(es).
Buenas tengo una base de datos de esta forma:

Fila|..Tipo..|Nombre|...
..1...Negro....Tipo1
..2...Negro......1

Y quiero hacer una consulta a la columna Nombre de manera que si existe el nombre me cambie una imagen. El problema es que si busco un Int(1) o un Long(1) funciona pero si busco un String(Tipo1) no funciona. Creo que el problema está en la manera de buscar el string en la columna. Lo hago de la siguiente manera:

Método que funciona: (Me devuelve 1 que es lo que busco y digo que devuelva)

Código:
public String getNombre() { 
		
		//String nombre = "Tipo1";
		int x = 1;
		
		String[]columnas = new String[]{ID_FILA,ID_TIPO,ID_NOMBRE};
		Cursor c = nBD.query(N_TABLA, columnas, ID_NOMBRE+ "=" + x, null, null, null, null);
		 		 		
		if(c!=null){
			c.moveToFirst();
			String ntesttipo = c.getString(2);
			return ntesttipo;	
		}
		return null;	 
	}


Método que NO funciona: (No me devuelve nada)

Código:
public String getNombre() { 
		
		String nombre = "Tipo1";
		//int x = 1;
		
		String[]columnas = new String[]{ID_FILA,ID_TIPO,ID_NOMBRE};
		Cursor c = nBD.query(N_TABLA, columnas, ID_NOMBRE+ "=" + nombre, null, null, null, null);
		 		 		
		if(c!=null){
			c.moveToFirst();
			String ntesttipo = c.getString(2);
			return ntesttipo;	
		}
		return null;	 
	}


La cuestión es que no sé porque no me encuentra un string y si busco un int o long sí.

También probé de esta manera pero tampoco funciona.

Código:
public String getTipo() { 
		
		String[]nombre = new String[] {"Tipo1"};
		String[]columnas = new string[]{ID_FILA,ID_TIPO,ID_NOMBRE};
		 
		Cursor c = nBD.query("N_TABLA", columnas, "ID_NOMBRE=?", nombre, null, null, null);
		
		if(c!=null){
			c.moveToFirst();
			String ntesttipo = c.getString(2);
			return ntesttipo;	
		}
		return null;
	}


P.D: Gracias de antemano por vuestras respuestas.

Editado por un usuario jueves, 7 de noviembre de 2013 20:15:06(UTC)  | Razón: No especificada

admin  
#2 Publicado : jueves, 7 de noviembre de 2013 15:40:46(UTC)
admin

Posición: Administration

Grupos: Administrators
Registrado: 07/10/2010(UTC)
Mensajes: 436
Hombre
Ubicación: España

Agradecimientos: 38 veces
Fue agradecido: 49 vez/veces in 48 publicación(es).
Hola!!

Enorabuena!! veo que ya vas para nota! ;P

bueno esto de las sentencias de SQL tiene su cosa, si no haces las consultas exactamente como son, para eso, no devuelben nada o dan error, creo que el problema esta que te falta la comilla simple cuando haces el filtro.

leete esta leccion atentamente y veras que solucionas tu problema:

http://www.aprendeandroid.com/l5/sql3.htm

ya te digo que las consultas debes hacerlas con la comilla simple en plan:

Código:

 WHERE nombre='carlos'


suerteeeee ahhh por favor dinos si finalmente lo solucionaste! ;P
Un saludo,

Curso Completo GRATIS paso a paso de como programar Android
http://www.aprendeandroid.com
Doradiolly  
#3 Publicado : jueves, 7 de noviembre de 2013 19:08:21(UTC)
Doradiolly

Posición: Member

Grupos: Registered
Registrado: 06/10/2013(UTC)
Mensajes: 28

Agradecimientos: 1 veces
Fue agradecido: 3 vez/veces in 2 publicación(es).
Pues estoy dándole vueltas al tema y he puesto la consulta de esta manera:

Código:
public String getTipo() { 
		 
		Cursor c = nBD.rawQuery("SELECT ID_NOMBRE FROM N_TABLA WHERE ID_NOMBRE='Tipo1' ",null); 
		 
		if(c!=null){
			c.moveToFirst();
			String ntipo = c.getString(2);
			return ntipo;	
		}
		return null; 
	}


Pero no me funciona. No consigo entender porque si busco un string no funciona y con un entero de esta manera sí. La verdad es que no se que estaré haciendo mal.

Código:

int x = 1;
		
		String[]columnas = new String[]{ID_FILA,ID_TIPO,ID_NOMBRE};
		
		Cursor c = nBD.query(N_TABLA, columnas, ID_NOMBRE+ "=" + x, null, null, null, null);

Doradiolly  
#4 Publicado : jueves, 7 de noviembre de 2013 19:31:53(UTC)
Doradiolly

Posición: Member

Grupos: Registered
Registrado: 06/10/2013(UTC)
Mensajes: 28

Agradecimientos: 1 veces
Fue agradecido: 3 vez/veces in 2 publicación(es).
Aquí creo que me he equivocado lo he vuelto a poner así pero sigue sin ir.

Código:
String ntipo = c.getString(0);
admin  
#5 Publicado : viernes, 8 de noviembre de 2013 13:14:45(UTC)
admin

Posición: Administration

Grupos: Administrators
Registrado: 07/10/2010(UTC)
Mensajes: 436
Hombre
Ubicación: España

Agradecimientos: 38 veces
Fue agradecido: 49 vez/veces in 48 publicación(es).
Hola!

¿como has creado la Base de datos? puedes colgar aqui la sentencia de la creacion de la Base de Datos?

Veo cosas "raras" ;P

¿seguro respetas las mayusculas y nimusculas?

no te preocupes estas cosas son algo que pones mal en plan sintasis ¡¡seguro lo solucionamos!!
Un saludo,

Curso Completo GRATIS paso a paso de como programar Android
http://www.aprendeandroid.com
Doradiolly  
#6 Publicado : viernes, 8 de noviembre de 2013 16:54:54(UTC)
Doradiolly

Posición: Member

Grupos: Registered
Registrado: 06/10/2013(UTC)
Mensajes: 28

Agradecimientos: 1 veces
Fue agradecido: 3 vez/veces in 2 publicación(es).
Bueno pues te pongo todo el código así vemos mejor donde puede fallar.

Te explico: Lo otro que te puse era un ejemplo para no estar trasteando con la App principal(Aplicación para hacer test) por si la liaba, supongo que me entiendes. Jejeje. Te pongo aquí los dos archivos. Uno donde se crea la base de datos y otro donde se recoge la información de la función o método que comprueba si el test esta echo y pone una imagen u otra según este hecho o no.



Ingles_gramatica_menu.class (Hace la llamada al método que comprueba si el test está hecho).
Código:
......
		
InglesGRAMATICA inglesgram = new InglesGRAMATICA(this);
	try {
		inglesgram.abrir();
		String btipo = inglesgram.getTipo();
		inglesgram.cerrar();
		vuelta.setText(btipo);
			
		if(btipo.contentEquals("Tipo1")){
		iv_marca_ingles_gramatica_test1.setImageResource(R.drawable.ic_realizado);
		}			
	} catch (Exception e) {
			//e.printStackTrace();
	iv_marca_ingles_gramatica_test1.setImageResource(R.drawable.ic_no_realizado);
			 
}
.......


InglesGRAMATICA.class (Clase que crea la base de datos y los métodos)
Código:

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;

public class InglesGRAMATICA {
	
	          public static final String ID_FILA = "_id";
	          public static final String ID_TIPO = "tipo_test";
	          public static final String ID_NOMBRE = "nombre_test";
	          public static final String ID_NPREGUNTAS = "numero_preguntas";
	          public static final String ID_NOTA = "nota";
	          public static final String ID_CONTESTADAS = "contestadas";
	          public static final String ID_ERRORES = "errores";
	          public static final String ID_BLANCO = "en_blanco";
	          public static final String ID_ACERTADAS = "acertadas";
	          public static final String ID_FECHA = "fecha_ingreso";
	
	          private static final String N_BD = "Test_Ingles"; //Nombre de la BD
	          private static final String N_TABLA = "Tabla_Test_Gramatica"; // Nombre de la tabla
	          private static final int VERSION_BD = 1; // Versión de la BD.
	
	          private BDHelper nHelper;      // Instancia de BDHelper
	          private final Context nContexto; // El contexto
	          private SQLiteDatabase nBD;    //Instancia de SQLiteDataHelper
	             
	          private static class BDHelper extends SQLiteOpenHelper{

		public BDHelper(Context context) {
			super(context, N_BD, null, VERSION_BD);
			// TODO Auto-generated constructor stub
		}

		@Override
		public void onCreate(SQLiteDatabase db) {// CREA LA BD SI NO HAY.
			// TODO Auto-generated method stub
			db.execSQL("CREATE TABLE " + N_TABLA + "(" + 
		    ID_FILA + " INTEGER PRIMARY KEY AUTOINCREMENT, " +					
                    ID_TIPO + " TEXT NOT NULL, " +
                    ID_NOMBRE + " TEXT NOT NULL, " +
                    ID_NPREGUNTAS + " INTEGER, " +
                    ID_NOTA + " DECIMAL, " +
                    ID_CONTESTADAS + " INTEGER, " +
                    ID_ERRORES + " INTEGER, " +
                    ID_BLANCO + " INTEGER, " +
                    ID_ACERTADAS + " INTEGER, " +
                    ID_FECHA + " TIMESTAMP NOT NULL);");
		}

		@Override
		public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
			// TODO Auto-generated method stub
			db .execSQL("DROP TABLE IF EXISTS " + N_TABLA);//Elimina la tabla si existe
			onCreate(db);
		}		
	}
	
	public InglesGRAMATICA (Context c){ 
		nContexto = c;
	}
	
	public InglesGRAMATICA abrir() throws Exception{
		nHelper = new BDHelper(nContexto);
		nBD = nHelper.getWritableDatabase();
		return this;
	}

	public void cerrar() {
		// TODO Auto-generated method stub
		nHelper.close();	
	}
	
	public long crearEntrada(String tipo,String nombre,String n_preguntas,String nota,String int_contestadas,String int_errores,String int_blanco,String int_acertadas,String fecha) {
		// TODO Auto-generated method stub
		ContentValues cv = new ContentValues();
		cv.put(ID_TIPO, tipo);
		cv.put(ID_NOMBRE, nombre);
		cv.put(ID_NPREGUNTAS, n_preguntas);
		cv.put(ID_NOTA, nota);
		cv.put(ID_CONTESTADAS, int_contestadas);
		cv.put(ID_ERRORES, int_errores);
		cv.put(ID_BLANCO, int_blanco);
		cv.put(ID_ACERTADAS, int_acertadas);
                cv.put(ID_FECHA, fecha);
		return nBD.insert(N_TABLA, null, cv);
		
	}
	
	public Cursor recibir() {
		// TODO Auto-generated method stub
		String[]columnas = new String[]{ID_FILA,ID_TIPO,ID_NOMBRE,ID_NPREGUNTAS,ID_NOTA,ID_CONTESTADAS,ID_ERRORES,
                                                ID_BLANCO,ID_ACERTADAS,ID_FECHA};
		Cursor c = nBD.query(N_TABLA, columnas, null, null, null, null, null);
		String resultado = "";
		
		int iFila = c.getColumnIndex(ID_FILA);
		int iTipo = c.getColumnIndex(ID_TIPO);
		int iNombre = c.getColumnIndex(ID_NOMBRE);
		int iNpreguntas = c.getColumnIndex(ID_NPREGUNTAS);
		int iNota = c.getColumnIndex(ID_NOTA);
		int iContestadas = c.getColumnIndex(ID_CONTESTADAS);
		int iErrores = c.getColumnIndex(ID_ERRORES);
		int iBlanco = c.getColumnIndex(ID_BLANCO);
		int iAcertadas = c.getColumnIndex(ID_ACERTADAS);
		int iFecha = c.getColumnIndex(ID_FECHA);
		
		for(c.moveToFirst();!c.isAfterLast();c.moveToNext()){
			resultado = resultado + "  " + c.getString(iFila) + "" + c.getString(iTipo)+ " "+ c.getString(iNombre)+  
                                    " "+ c.getString(iNota)+ " " + c.getString(iNpreguntas)+ " "+ c.getString(iContestadas)+ 
            " "+ c.getString(iErrores)+ " "+ c.getString(iBlanco)+ "  "+ c.getString(iAcertadas)+ " "+ c.getString(iFecha)+ "\n";
			
		}
		return c;
	}

	public String getTipo() { // ***************  FUNCIÓN QUE NOS INTERESA  ***************
		
		//String[] tipo = new String[] {"Tipo1"};
		
		//int x = 1;
		
		//String[]columnas = new String[]{ID_FILA,ID_TIPO,ID_NOMBRE,ID_NPREGUNTAS,ID_NOTA,ID_CONTESTADAS,ID_ERRORES,
                                                 ID_BLANCO,ID_ACERTADAS,ID_FECHA};
		
		//PRUEBAS:
		Cursor c = nBD.rawQuery("SELECT ID_NOMBRE FROM N_TABLA WHERE ID_NOMBRE='Tipo1' ",null); 
		
		//Cursor c = nBD.query("N_TABLA", columnas, "ID_NOMBRE=?", tipo, null, null, null);
		//Cursor c = nBD.query(N_TABLA, columnas, ID_NOMBRE+ "=" + x, null, null, null, null);
		//Cursor c = nBD.query(N_TABLA, columnas, ID_NOMBRE, tipo, null, null, null);
		//Cursor c = nBD.rawQuery("SELECT ID_NOMBRE FROM N_TABLA WHERE ID_NOMBRE=? ", tipo);  
		//Cursor c = nBD.query("N_TABLA", columnas, "ID_NOMBRE=?", tipo, null, null, null);
		if(c!=null){
			c.moveToFirst();
			String ntipo = c.getString(2);
			return ntipo;	
		}	

		return null;
		 
	}
	
}


P.D: Un millón de garcias por el empeño y la ayuda que me prestas. A ver si lo podemos solucionar.

Editado por un usuario viernes, 8 de noviembre de 2013 18:21:44(UTC)  | Razón: No especificada

admin  
#7 Publicado : lunes, 11 de noviembre de 2013 23:49:19(UTC)
admin

Posición: Administration

Grupos: Administrators
Registrado: 07/10/2010(UTC)
Mensajes: 436
Hombre
Ubicación: España

Agradecimientos: 38 veces
Fue agradecido: 49 vez/veces in 48 publicación(es).
Hola!!

Pues veo varios fallos... :S

1.Llamas a los campos de la base de datos en los SELECT con el nombre de la variable de tipo String con la que has creado la base de datos por ejemplo:

Código:

public static final String ID_NOMBRE = "nombre_test";


y luego haces el SELECT con:

Código:

//PRUEBAS:
Cursor c = nBD.rawQuery("SELECT ID_NOMBRE FROM N_TABLA WHERE ID_NOMBRE='Tipo1' ",null); 


creo que hay cometes el primer error... tienes que llamar a los campos por su monbre real, no el de la variable que as usado para crear la BD. es decir:

Código:

//PRUEBAS:
Cursor c = nBD.rawQuery("SELECT nombre_test FROM N_TABLA WHERE nombre_test='Tipo1' ",null); 


2.Llamas al cursor con la posicion (2) cuando deberias hacerlo con la posicion (0) porque en el SELECT de arriba solo selecionas un campo, el ID_NOMBRE que equivale a "nombre_test".

por lo que lo correcto seria:

Código:

if(c!=null){
            c.moveToFirst();
            String ntipo = c.getString(0);
            return ntipo;    
        }   


bueno, espero que lo soluciones!! ;P

Editado por un usuario lunes, 11 de noviembre de 2013 23:51:34(UTC)  | Razón: No especificada

Un saludo,

Curso Completo GRATIS paso a paso de como programar Android
http://www.aprendeandroid.com
Doradiolly  
#8 Publicado : martes, 12 de noviembre de 2013 10:53:47(UTC)
Doradiolly

Posición: Member

Grupos: Registered
Registrado: 06/10/2013(UTC)
Mensajes: 28

Agradecimientos: 1 veces
Fue agradecido: 3 vez/veces in 2 publicación(es).
Bueno he vuelto a probar con las últimas modificaciones y no funciona. Pero no pasa nada. Voy a terminar una parte que llevo ya dos días y no quiero dejar a medias. Y en cuanto termine con ella me pongo con esto y voy a hacer una chapucilla que pensé. Consiste en meterle una columna más a la tabla llamada por ejemplo ID_REALIZADO de tipo int o long y que guarde un número según el test realizado así haciéndolo de la manera, siguiente debería funcionar.


Código:

public String getTipo() { 
		
		
		int x = 1;
		
		String[]columnas = new String[]{ID_FILA,ID_TIPO,ID_NOMBRE,ID_NPREGUNTAS,ID_NOTA,ID_CONTESTADAS,ID_ERRORES,ID_BLANCO,ID_ACERTADAS,ID_FECHA,ID_REALIZADO };
 
		Cursor c = nBD.query(N_TABLA, columnas, ID_REALIZADO+ "=" + x, null, null, null, null);
	 
		if(c!=null){
			c.moveToFirst();
			String ntipo = c.getString(10);
			return ntipo;	
		}	

		return null;
		 
	}


P.D: Un millón de gracias por tu tiempo, en cuanto lo haga te comento si funciono.
admin  
#9 Publicado : miércoles, 13 de noviembre de 2013 15:52:40(UTC)
admin

Posición: Administration

Grupos: Administrators
Registrado: 07/10/2010(UTC)
Mensajes: 436
Hombre
Ubicación: España

Agradecimientos: 38 veces
Fue agradecido: 49 vez/veces in 48 publicación(es).
Hola!

Ya te digo, el problema esta en como llamas a los campos en la consulta.... prueba como te dije, ya veras que se soluciona!

;P
Un saludo,

Curso Completo GRATIS paso a paso de como programar Android
http://www.aprendeandroid.com
Doradiolly  
#10 Publicado : jueves, 14 de noviembre de 2013 11:41:10(UTC)
Doradiolly

Posición: Member

Grupos: Registered
Registrado: 06/10/2013(UTC)
Mensajes: 28

Agradecimientos: 1 veces
Fue agradecido: 3 vez/veces in 2 publicación(es).
Estuve probando pero ni aun así consigo hacer que me busque un string...en cuanto incluya un campo más en la base de datos y pruebe de esa manera te cuento.
Doradiolly  
#11 Publicado : viernes, 15 de noviembre de 2013 0:11:55(UTC)
Doradiolly

Posición: Member

Grupos: Registered
Registrado: 06/10/2013(UTC)
Mensajes: 28

Agradecimientos: 1 veces
Fue agradecido: 3 vez/veces in 2 publicación(es).
Al final lo conseguí como te comente. Añadí a la base de datos un campo más llamado hecho y guardo hay el número del test que realizo. Y como es un número pues no tengo problemas por encontrarlo de la manera que comente arriba.

Sinceramente me hubiera gustado hacerlo de la manera que me has comentado, no ya por el trabajo que me ahorro sino por saber que puedo hacer las cosas de otra forma y que funcionan.

P.D: Un millón de gracias como siempre por tu tiempo y tus consejos ;-)
admin  
#12 Publicado : lunes, 18 de noviembre de 2013 23:56:23(UTC)
admin

Posición: Administration

Grupos: Administrators
Registrado: 07/10/2010(UTC)
Mensajes: 436
Hombre
Ubicación: España

Agradecimientos: 38 veces
Fue agradecido: 49 vez/veces in 48 publicación(es).
Hola!

Pues me da rabia que no te halla salido....

Por si te vale de inspiracion te adjunto algunos codigos que use en otras aplicaciones:

Código:

this.c = db.rawQuery(" SELECT _ID, direccion, localidad, provincia FROM restaurantes WHERE (tipo_vale='"+tipocapa+"' and lat='') ", null );

db.update("restaurantes", update_registro, "_ID='"+id+"'", null);

this.c = db.rawQuery(" SELECT lat, lon, nombre, direccion, telefono FROM restaurantes WHERE (tipo_vale='"+tipocapa+"' and lat<>'' and (lat<'"+(lat+dist)+"' and lat>'"+(lat-dist)+"') and (lon<'"+(lon+dist)+"' and lon>'"+(lon-dist)+"'))  LIMIT 500", null );




espero que te sirva de guia o ejemplos!! yo aprendo asi!! ;P
Un saludo,

Curso Completo GRATIS paso a paso de como programar Android
http://www.aprendeandroid.com
Doradiolly  
#13 Publicado : jueves, 21 de noviembre de 2013 10:50:23(UTC)
Doradiolly

Posición: Member

Grupos: Registered
Registrado: 06/10/2013(UTC)
Mensajes: 28

Agradecimientos: 1 veces
Fue agradecido: 3 vez/veces in 2 publicación(es).
Gracias por tu empeño, tu tiempo y por el ejemplo. Lo tendré encuenta para próximas consultas.
Usuarios navegando este tema
Guest
Salto de foro  
No puedes iniciar nuevos temas en este foro.
No puedes responder a temas en este foro.
No puedes eliminar sus temas en este foro.
No puedes editar sus temas en este foro.
No puedes crear encuestas en este foro.
No puedes votar las encuestas en este foro.