Android - Sqlite problemas con declaracion de la tabla

 
Vista:
sin imagen de perfil
Val: 197
Plata
Ha mantenido su posición en Android (en relación al último mes)
Gráfica de Android

Sqlite problemas con declaracion de la tabla

Publicado por Luis (97 intervenciones) el 02/10/2016 23:41:05
hola de nuevo, otra vez liado en esta ocasion con los campos de la base de datos SQLITE.

Me explico el metodo guardar unas veces guarda correctamente y otras se cierra la aplicacion sin llegar a guardar.

Esta es como abro y creo la base de datos y la tabla.

1
2
3
dbb=openOrCreateDatabase("StandarDB", Context.MODE_PRIVATE, null);
 
dbb.execSQL("CREATE TABLE IF NOT EXISTS standar(Fecha VARCHAR,Circuito VARCHAR,Veiculo VARCHAR);");

Tal como esta unas veces guarda y otras se cierra.

Explicacion del reparto de la tabla:

* Fecha VARCHAR =
obtengo la fecha del telefono y la muestro en un TextView con este metodo;
1
2
3
4
Calendar c = Calendar.getInstance();
        SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
        String formattedDate = df.format(c.getTime());
        fechayhora.setText(formattedDate);
________________________


*Circuito VARCHAR =
Tengo un Array de String que contiene unos 100 circuitos diferentes y mediante seleccion aleatoria se muestra uno en el TextView. El contenido de los circuitos es de texto e inclulle numeros y caracteres, he ahi donde creo que esta el error ya que unos circuitos inclullen numeros y otros no por eso creo que VARCHAR no es correcto he provado INT,TEXT,CHAR y unas veces se rompe y otras no.

Este es un ejemplo de los circuitos:
-Montes de asia 4.000 mtrs / Clima: variable / Hora: Variable
-Pirineo - Oeste / Clima: Variable 10.372,7 mtrs

Mezclamos numeros y texto ¿Que tipo de campo se deve poner?

Cuando termina la eleccion aleatoria del circuito se muestra el resultado en el TextView que le corresponde y se lanza el metodo seleccionVeiculo();

__________________________________________________


*Veiculo =
Lo mismo que en Circuitos un array de String y tambien hay una mezcla de diferentes tipos en el que unos solo inclullen texto y otros texto,numeros y caracteres.

Este es un ejemplo de los Veiculos.
- AUTMOVIL Personal X DIVision Gran Capacidad
- Subaru IMPREZA Sedan (18inch BBS Wheel Option) '10

Por eso no se que asignar a los campos de la tabla. si INT Char He estado buscando en:

http://www.aprenderaprogramar.com/index.php?option=com_content&view=article&id=140:tipos-de-variables-en-visual-basic-integer-single-double-string-object-boolean-etc-ejemplos-cu00308a&catid=37:curso-aprender-a-programar-visual-basic-desde-cero&Itemid=61

Pero no consigo entender cual es la correcta para cada campo.

Fecha = xxx
Circuito = xxx
Veiculo = xxx


Esta es la activity con los metodos;

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
public class Sorteoestandar extends AppCompatActivity {
 
    TextView fechayhora;
    TextView resultadocircuito;
    TextView resultadoVeiculo;
 
    SQLiteDatabase dbb;
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.sorteoestandar);
 
 
        fechayhora = (TextView) findViewById(R.id.textViewdata);
        resultadocircuito = (TextView) findViewById(R.id.textViewcircuito);
        resultadoVeiculo = (TextView) findViewById(R.id.textViewveiculo);
 
 
            dbb=openOrCreateDatabase("StandarDB", Context.MODE_PRIVATE, null);
            dbb.execSQL("CREATE TABLE IF NOT EXISTS standar(Fecha VARCHAR,Circuito VARCHAR,Veiculo VARCHAR);");
 
 
        Calendar c = Calendar.getInstance();
        SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy HH:mm:ss");
        String formattedDate = df.format(c.getTime());
 
       // Muestro la Fecha y hora en su textView en este formato 02-10-2016 19:58:19
        fechayhora.setText(formattedDate);
 
 
         IniciarSorteo.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                       // Aqui todo el sorteo Y al final se lanza guardar
 
                     Guardar();
 
                }
        });
 
 
 
        public void Guardar() {
                        fechayhora.getText();
                        resultadocircuito.getText();
                        resultadoVeiculo.getText();
 
                dbb.execSQL("INSERT INTO standar VALUES('"+fechayhora.getText()+"','"+resultadocircuito.getText()+
                        "','"+resultadocoche.getText()+"');");
 
                showMessage("Sorteo guardado en historial", "Correctamente");
        }
 
 
        public void showMessage(String title, String message) {
                AlertDialog.Builder builder = new AlertDialog.Builder(this);
                builder.setTitle(title) ;
                builder.setMessage(message);
                //   .setTitle("Atenci�n!!")
                builder.setCancelable(false);
                builder.setNeutralButton("Aceptar",
                        new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int id) {
                                        dialog.cancel();
                                }
                        });
                AlertDialog alert = builder.create();
                alert.show();
        }

Este es un log de los errores que me muestra "Cuando se Force Closed"

E/Database: Failure 1 (near "89": syntax error) on 0x250d38 when preparing 'INSERT INTO standar VALUES('02-10-2016 20:11:21',' Montes Belticos 2.045 mtrs / Clima: variable','Trineo CASERO ED 2.0 X 4WS '89');'.

10-02 20:11:52.128 11506-11506/? D/AndroidRuntime: Shutting down VME/AndroidRuntime: FATAL EXCEPTION: main
android.database.sqlite.SQLiteException: near "89": syntax error: INSERT INTO standarte VALUES('02-10-2016 20:11:21',' Montes Belticos 2.045 mtrs / Clima: variable','Trineo CASERO ED 2.0 X 4WS '89');
at android.database.sqlite.SQLiteDatabase.native_execSQL(Native Method)

¿ Que es exactamente (near "89":) ? A que punto se refiere??

Gracias por haberse detenido ha leer este post se agradece cualquier ayuda.

Gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil
Val: 444
Oro
Ha mantenido su posición en Android (en relación al último mes)
Gráfica de Android

Sqlite problemas con declaracion de la tabla

Publicado por juanki (253 intervenciones) el 03/10/2016 10:35:19
Hola

¿Porqué creas la tabla directamente en la Activiry? ¿Porqué no usas la forma que te propone la documentación?:

https://developer.android.com/training/basics/data-storage/databases.html
http://www.sgoliver.net/blog/bases-de-datos-en-android-i-primeros-pasos/
http://www.hermosaprogramacion.com/2014/10/android-sqlite-bases-de-datos/

Te aseguro que es la primera vez que veo hacerlo así.

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 197
Plata
Ha mantenido su posición en Android (en relación al último mes)
Gráfica de Android

Sqlite problemas con declaracion de la tabla

Publicado por Luis (97 intervenciones) el 03/10/2016 11:17:58
Hola Juanki gracias por responder.
Ya he leído todos esos post son lo primero que te sale cuando buscas tutoriales sobre Android sqlite y los tengo probados y funcionando.

Pero encontré un tutorial que me pareció cómodo por mi inespeiencia y practico para mis fines ya que no tenía que crear una clase para la bd otra para recoger geter y seters era un todo en uno y funciona perfectamente ese código.

El problema lo tengo con los datos que recojo del texto viev que en mi caso en unas ocasiones es texto en otras número y otras texto números y caracteres es por eso que creo que el problema es con los campos que no se adecuan al contenido no se si poner integer lonvarchar nose.

Te dejo el enlace del tutorial y por gusto me gustaría que me comentaste por aquí o privado su opinión y ya de paso comentar que en todos los tutoriales se ve como después de hacer una consulta en la base de datos esta se ha de cerrar bd.close();
Y en este ejemplo no veo que la cierre nunca y se lo he preguntado pero sin respuesta.

Observa los métodos el que estoy usando es únicamente guardar y ver todo.
Ya te comento que funciona perfectamente y sin cerrar la db.close();

Si los moderadores consideran que este enlace está fuera de lugar que lo borren y disculpen.

http://www.codeproject.com/Articles/783073/A-Simple-Android-SQLite-Example
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 444
Oro
Ha mantenido su posición en Android (en relación al último mes)
Gráfica de Android

Sqlite problemas con declaracion de la tabla

Publicado por juanki (253 intervenciones) el 03/10/2016 12:05:10
Hola

Entonces el problema lo tendrás con la base de datos y los tipos de datos. Las bases de datos no es lo mio, pero si has declarado un campo de tipo texto, pues la base de datos esperará un texto, que lo tienes que poner entre comillas, y si es un valor numérico pues no. Tienes que repasar que estés enviando el tipo de dato correcto que espera recibir.

Los métodos que trae Android para manejar las bases de datos te ayudan en esa labor, al escribir todas las sentencias SQL en RAW tienes que prestar atención a esos detalles.

A ver si luego puedo echar un vistazo al enlace (se supone que ahora estoy trabajando XD)

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 197
Plata
Ha mantenido su posición en Android (en relación al último mes)
Gráfica de Android

Sqlite problemas con declaracion de la tabla

Publicado por Luis (97 intervenciones) el 03/10/2016 14:20:39
Gracias, de eso se trata de como preparar cada campo para recibir datos diferentes cada ocasión.
Existe algun método que lo soporte o como hacerlo.

He mirado esta documentación pero no tengo claro que poner en cada campo.

http://www.h2database.com/html/datatypes.html
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 444
Oro
Ha mantenido su posición en Android (en relación al último mes)
Gráfica de Android

Sqlite problemas con declaracion de la tabla

Publicado por juanki (253 intervenciones) el 03/10/2016 17:06:39
Hola

Ahora creo que entendí, en un mismo campo de la tabla de la base de datos quieres guardar datos de diferente tipo cada vez. Desconozco completamente si eso se puede hacer, diría que no, pero como digo, las bases de datos no es lo mio.

Se me ocurre una opción, declara ese campo como de texto, y todo lo que guardes hazlo como texto y añades una columna más a la base de datos en la que guardes el tipo de dato que contiene y luego en tu programa los procesas adecuadamente.

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 197
Plata
Ha mantenido su posición en Android (en relación al último mes)
Gráfica de Android

Sqlite problemas con declaracion de la tabla

Publicado por Luis (97 intervenciones) el 03/10/2016 19:07:49
No acabo de entenderte.
añades una columna más a la base de datos en la que guardes el tipo de dato que contiene y luego en tu programa los procesas adecuadamente

Al la hora de mostrarlos se muestran en un mensaje.
Si los guardo como texto los recojo como texto.

Ayer probé con los tres campos como texto y se cerraba.

Has podido ver el enlace??
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 444
Oro
Ha mantenido su posición en Android (en relación al último mes)
Gráfica de Android

Sqlite problemas con declaracion de la tabla

Publicado por juanki (253 intervenciones) el 03/10/2016 20:05:16
Hola

Los campos tienen que se de tipo TEXT, ya que lo que vas a guardar son cadenas (incluyan o no número eso da igual). Pero llegados a este punto, lo primero que tienes que averiguar es el error que te da, por que si no estamos dando palos de ciego.

Cuando dices "se cierra" es que ocurre un error y tienes que averiguar cual. Conecta el móvil al ordenador y lanza la aplicación desde AndroidStudio y cuando "se cierre" obtendrás un log completo de todo lo ocurrido.

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 197
Plata
Ha mantenido su posición en Android (en relación al último mes)
Gráfica de Android

Sqlite problemas con declaracion de la tabla

Publicado por Luis (97 intervenciones) el 03/10/2016 20:56:23
El log ya lo comenté en el post gracias por seguir aquí ayudando.
Este es el log

Este es un log de los errores que me muestra "Cuando se Force Closed"

E/Database: Failure 1 (near "89": syntax error) on 0x250d38 when preparing 'INSERT INTO standar VALUES('02-10-2016 20:11:21',' Montes Belticos 2.045 mtrs / Clima: variable','Trineo CASERO ED 2.0 X 4WS '89');'.

10-02 20:11:52.128 11506-11506/? D/AndroidRuntime: Shutting down VME/AndroidRuntime: FATAL EXCEPTION: main
android.database.sqlite.SQLiteException: near "89": syntax error: INSERT INTO standarte VALUES('02-10-2016 20:11:21',' Montes Belticos 2.045 mtrs / Clima: variable','Trineo CASERO ED 2.0 X 4WS '89');
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 444
Oro
Ha mantenido su posición en Android (en relación al último mes)
Gráfica de Android

Sqlite problemas con declaracion de la tabla

Publicado por juanki (253 intervenciones) el 03/10/2016 21:44:40
Hola

En los datos que intentas insertar y que se muestran en el mensaje de error veo un detalle: 'Trineo CASERO ED 2.0 X 4WS '89'. Delante del 89 hay una comilla, por lo tanto el 89 queda fuera y por eso da error. Si ese es el problema tendrás que reemplazar ese carácter por otro o tratar de encerrar entre comillas dobles la cadena a insertar.

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 197
Plata
Ha mantenido su posición en Android (en relación al último mes)
Gráfica de Android

Sqlite problemas con declaracion de la tabla

Publicado por Luis (97 intervenciones) el 04/10/2016 00:56:51
Hola Juanki he revisado todo el array de Strings y practicamente todos los modelos acaban en '87 '92 '00 indicando el año con la coma.

Luego comparando con los que si me guardaba en la base de datos cuando no se cerraba no encontraba la diferencia pero TU ERES UN MAKINAAAAAAAA

Te has percatado de esa pu....t....a coma y es que resulta que los que si guarda cuando no se rompe no llevan esa coma llevan esta otra ’ que si no cojo una lupa nunca hubiese visto la diferencia.

Esta '88 se cierra la aplicacion

y esta ’88 no la rompe si no amplias no lo ves no se decirte el nombre de esa coma apostrofe o como se llame.

Te debo una que grande eres y yo pensando que era culpa del campo he dejado los tres campos en varchar y va de lujo a parte al final del metodo guardar he puesto db.close(); ya que cuando salia de la aplicacion el log me decia que no estaba cerrada la database, en el ejemplo que segui tampoco la cerraba y tambien daba ese error de que no esta cerrada.

Ahora solo faltaria encontrar un tipo para el campo que admitiese esa coma ya que si no este fin de semana que viene me tocara revisar cerca de 2.000 comas. Andare con una lupa.
Pero con paciencia y saliva ya se sabe.

Mil millones de gracias Juanki ya por fin me puedo ir a dormir tranquilo.

Y ya me comentaras si viste el post que puse es muy comodo para los que recien empezamos con bases de datos ya que no tienes que crear clase para bd clase para usuarios clase para metodos.

Bueno doy el Tema por cerrado gracias a ti Juanki y a todos los que nos han estado siguiendo desde el silencio.

No tardare en aparecer por aqui con algun otro atasco Saludos a todos.

Que disfruten programando.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 444
Oro
Ha mantenido su posición en Android (en relación al último mes)
Gráfica de Android

Sqlite problemas con declaracion de la tabla

Publicado por juanki (253 intervenciones) el 04/10/2016 10:40:26
Hola

El problema no es que en un campo tipo TEXT no se pueda guardar ese carácter. El problema está en que es la misma comilla simple que usas para encerrar la cadena de caracteres, por tanto el 88 queda fuera de la cadena y además queda una comilla extra detrás del 89 (la que debería cerrar la cadena):

'Trineo CASERO ED 2.0 X 4WS '89'

Como ves, sobra una comilla y el 89 queda fuera de la cadena. Ese es el problema, por eso da error al preparar la sentencia SQL.

Tienes tres opciones, reemplazar la comilla simple(') por comilla doble(") para encerrar las cadenas en la sentencia SQL.
Repasar todos las cadenas y quitar ese carácter.
O usar las clases que te propone Android para el manejo de datos. Si usas el método insert y le pasas un ContentValues creo que no tendrás ese problema, ya que la propia API se hace cargo de manejar las cadenas adecuadamente.

El enlace que pasaste lo repasé por encima, pero no me gusta esa forma de acceder a la base de datos, fíjate los problemas que te ha dado a ti una simple comilla. Personalmente recomiendo y uso la forma que te propone Android en su documentación, tienes que escribir un poco más, pero evitas muchos errores.

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 197
Plata
Ha mantenido su posición en Android (en relación al último mes)
Gráfica de Android

Sqlite problemas con declaracion de la tabla

Publicado por Luis (97 intervenciones) el 04/10/2016 12:13:19
Hola es solo por aclarar el array de String done están los vehículos es una recopilación de diferentes webs son casi dos mil me limité a copiarlos y pegarlos lo que ha pasado es que los de algún grupo tenían esa comilla.
Cada uno dentro del array esta representando de esta manera.
"Trineo CASERO ED 2.0 X 4WS '89"
Con comilla simple antes del '89 esos fueron los que daban el error.

Y el logtag mostraba esta línea con comillas simples al final después del 89 y realmente estaban con dobles " no se el por qué.

E/Database: Failure 1 (near "89": syntax error) on 0x250d38 when preparing 'INSERT INTO standar VALUES('02-10-2016 20:11:21',' Montes Belticos 2.045 mtrs / Clima: variable','Trineo CASERO ED 2.0 X 4WS '89');'.

10-02 20:11:52.128 11506-11506/? D/AndroidRuntime: Shutting down VME/AndroidRuntime: FATAL EXCEPTION: main
android.database.sqlite.SQLiteException: near "89": syntax error: INSERT INTO standarte VALUES('02-10-2016 20:11:21',' Montes Belticos 2.045 mtrs / Clima: variable','Trineo CASERO ED 2.0 X 4WS '89');

Como ves después del 89 muestra una comilla simple y yo en el array la tengo doble

Pero si no es por usted ahí se queda esa comilla no me habría dado cuenta hasta que hubiese comparado los que aceptaba y los que no.

La que te puede liar una comilla.

No te acostarás Sun saber una cosa más.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 444
Oro
Ha mantenido su posición en Android (en relación al último mes)
Gráfica de Android

Sqlite problemas con declaracion de la tabla

Publicado por juanki (253 intervenciones) el 04/10/2016 13:09:35
Hola

A ver si me explico. Tu las cadenas en el array de String lo tienes encerrado entre comillas dobles (") por que con esas comillas es como se encierran las cadenas en java. El problema lo tienes al formatear la cadena que le pasas a SQL.

Lo que le pasas a execSQL es una cadena de texto que, como es lógico va encerrada entre comillas dobles ("), PERO dentro de esa cadena usas comillas simples (') PARA ENCERRAR CADA DATO QUE LE PASAS A LA BASE DE DATOS, usa comillas dobles también para encerrar cada dato y podrás pasarle cualquier carácter. Mira el pequeño ejemplo que hice:

1
2
3
4
5
6
7
String fecha = "02-10-2016 20:11:21";
String circuito = "Montes Belticos 2.045 mtrs / Clima: variable";
String coche = "Trineo CASERO ED 2.0 X 4WS '89";
 
String cadena =  "INSERT INTO standar VALUES(\"" + fecha + "\",\"" + circuito + "\",\"" + coche + "\");";
 
System.out.println(cadena);

Esto imprime por pantalla:
INSERT INTO standar VALUES("02-10-2016 20:11:21","Montes Belticos 2.045 mtrs / Clima: variable","Trineo CASERO ED 2.0 X 4WS '89");


Como ves, cada dato va entre comillas dobles, ya no te dará problemas. Lo que no estoy seguro es si la base de datos acepta las cadenas así, pero supongo que si.

Entonces solo tienes que reemplazar las comillas simples por dobles dentro de tu cadena:
1
dbb.execSQL("INSERT INTO standar VALUES(\""+fechayhora.getText()+"\",\""+resultadocircuito.getText()+"\",\""+resultadocoche.getText()+"\");");

Para meter una comilla doble dentro de una cadena tienes que poner \".

Un saludo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil
Val: 197
Plata
Ha mantenido su posición en Android (en relación al último mes)
Gráfica de Android

Sqlite problemas con declaracion de la tabla

Publicado por Luis (97 intervenciones) el 04/10/2016 15:14:11
Ok esta noche probare de cambiar las comillas simples por dobles haber si aceptara.
Ya te contaré.

Yo el array lo tengo asi es de donde se realiza la selección aleatoria Random.

1
2
3
4
5
6
7
8
9
10
11
String[] nombres = {
                "luis",
                "pedro",
                "Tony",
                "Carlos ( Francisco) '89",
                "Maria",
                "Carla",
                "Marcos",
                "Javier",
                "Alfonso",
                "Roberto"};


En este ejemplo:

"Carlos ( Francisco) '89",

Daría error si sale seleccionado.

Esta noche lo pruebo haber si me ahorro cambiar 2.000 comillas.

Este hilo ya parece un curso de comillas.

Ya te cuento.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 197
Plata
Ha mantenido su posición en Android (en relación al último mes)
Gráfica de Android

Sqlite problemas con declaracion de la tabla

Publicado por Luis (97 intervenciones) el 05/10/2016 11:41:05
Juanki cuando pases por Denia avísame que te as ganado unas cervezas me as ahorrado repasarme cerca se 2.000 comas.
Funcionó perfectamente.

Mil gracias ya podemos cerrar el tema pero si algún observador quiere aportar algo adelante.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar