Spanish Problema con SQL

Jannete

Member
Hola todos. Estoy haciendo una aplicacion para una señora que saca prestamos grupales, y como ella lleva la administracion de su grupo, quise hacerle algo para facilitarle la vida. EL problema que aparte que estoy tratando de hacer funcionar la b4xtable con sql, me encontre con un error que nunca habia visto, veran, mi codigo es este:

B4X:
If FirstTime Then
        If File.Exists(RutaBase, NombreBD) = False Then
            sql1.Initialize(xui.DefaultFolder, "basedatos.db", True)
            
            sql1.ExecNonQuery("CREATE TABLE banco (ID INTEGER PRIMARY KEY , Nombre TEXT, MontoTotal DOUBLE, PagoSemanal DOUBLE, Semana INTEGER, Restante DOUBLE, Ahorro DOUBLE) ")
        Else
            sql1.Initialize(RutaBase, NombreBD, True)
        End If
    End If

Cuando trato de iniciar la aplicacion, me sale uno de dos errores:

android.database.sqlite.SQLiteCantOpenDatabaseException: Cannot open database '/data/user/0/mx.atest/files/data/user/0/mx.atest/files': Directory /data/user/0/mx.atest/files/data/user/0/mx.atest doesn't exist

Y el mas recurrente, es este:

android.database.sqlite.SQLiteException: near ")": syntax error (code 1 SQLITE_ERROR[1]): , While compiling: CREATE TABLE data )

¿Alguien me podria orientar un poco?. Incluso intentando con el codigo de ejemplo sale ese error.

Muchas gracias a todos y saludos!
 

drgottjr

Expert
Licensed User
Longtime User
no hay error para mi. pero he cambiado tu cogido un poquito.

no entiendo por que' dices "rutabase" y "nombrebd" en algun
momento, y luego "xui.defaultfolder" y "basedatos.db" en otro.
mala idea. no han de representar las mismas cosas?

si, en algun momento, cambias rutabase sin cambiar xui.defaultfolder, puede haber
un problema. lo ves?

esto: '/data/user/0/mx.atest/files/data/user/0/mx.atest/files' no suena.
y creo que se debe a lo que digo arriba.

si, por algun motivo prefieres usar variantes, entonces usalas, como en el ejemplo
adjunto.

B4X:
Log(xui.DefaultFolder)
Dim rutabase As String = xui.DefaultFolder
Dim nombrebd As String = "basedatos.db"

    If FirstTime Then
        If File.Exists(rutabase, nombrebd) = False Then
            Log("aqui por que falso")
            sql1.Initialize(rutabase, nombrebd, True)
            sql1.ExecNonQuery("CREATE TABLE banco (ID INTEGER PRIMARY KEY , Nombre TEXT, MontoTotal DOUBLE, PagoSemanal DOUBLE, Semana INTEGER, Restante DOUBLE, Ahorro DOUBLE) ")
        Else
            Log("aqui por que NO falso")
            sql1.Initialize(rutabase, nombrebd, True)
        End If
    End If


de todas formas asi veo la cosa. y como he dicho, no sale ningun error cuando ejecuto el codigo
 

Jannete

Member
no hay error para mi. pero he cambiado tu cogido un poquito.

no entiendo por que' dices "rutabase" y "nombrebd" en algun
momento, y luego "xui.defaultfolder" y "basedatos.db" en otro.
mala idea. no han de representar las mismas cosas?

si, en algun momento, cambias rutabase sin cambiar xui.defaultfolder, puede haber
un problema. lo ves?

esto: '/data/user/0/mx.atest/files/data/user/0/mx.atest/files' no suena.
y creo que se debe a lo que digo arriba.

si, por algun motivo prefieres usar variantes, entonces usalas, como en el ejemplo
adjunto.

B4X:
Log(xui.DefaultFolder)
Dim rutabase As String = xui.DefaultFolder
Dim nombrebd As String = "basedatos.db"

    If FirstTime Then
        If File.Exists(rutabase, nombrebd) = False Then
            Log("aqui por que falso")
            sql1.Initialize(rutabase, nombrebd, True)
            sql1.ExecNonQuery("CREATE TABLE banco (ID INTEGER PRIMARY KEY , Nombre TEXT, MontoTotal DOUBLE, PagoSemanal DOUBLE, Semana INTEGER, Restante DOUBLE, Ahorro DOUBLE) ")
        Else
            Log("aqui por que NO falso")
            sql1.Initialize(rutabase, nombrebd, True)
        End If
    End If


de todas formas asi veo la cosa. y como he dicho, no sale ningun error cuando ejecuto el codigo
Gracias, pero no creo que tenga que ver con eso, originalmente estaba en los globals declarado rutabase = File.DirInternal , pero como daba error, probé crear la tabla directo en esa dirección (sin usar la variable), como me seguía dando error busque y leí sobre xui.defaultfolder y quise probar, pero ninguna de las 3 formas me funcionó.

Incluso al poner sql.execnonquery sale la sintaxis del propio ide, y copie el ejemplo que da, compile y tampoco me creo la tabla.

Según recuerdo tengo b4a 9.80, y compile en un teléfono Android 12 (samsung), pensé que tal vez tendría algo que ver alguna de las dos anteriores (el ide no creo, ya que he hecho aplicaciones y compilado sin problemas).

Aun así muchas gracias.
 

josejad

Expert
Licensed User
Longtime User
Hola Jannete:

Sube un pequeño ejemplo que podamos "trastear".

saludos,
 

TILogistic

Expert
Licensed User
Longtime User
Ese error lo tuve hace poco, y me di cuenta que era problema de la base datos que estaba corrupta.

la borre del sistema y volví a copiar, y el problema se soluciono.

pruebe este ejemplo:

esta comentado el borrado de la base de datos.

B4X:
Dim dbname As String = "chinook_v1.db"
    
'    If File.Exists(xui.DefaultFolder, dbname) = True Then
'        File.Delete(xui.DefaultFolder, dbname)
'    End If
    
    If File.Exists(xui.DefaultFolder, dbname) = False Then
        File.Copy(File.DirAssets, "chinook.db", xui.DefaultFolder, dbname)
    End If
    
    #if B4J
        'B4J SQL object can access many types of databases (same as B4A JdbcSQL).
        sql.InitializeSQLite(xui.DefaultFolder, dbname, False)
    #else
        sql.Initialize(xui.DefaultFolder, dbname, False)
    #End If

1657876855203.png
 

Attachments

  • 111.zip
    338.8 KB · Views: 175

Jannete

Member
Hola Jannete:

Sube un pequeño ejemplo que podamos "trastear".

saludos,
Antes que nada muchas gracias por la pronta respuesta. Adjunto el proyecto con el que estoy trabajando, no he movido nada ya que me quede atorada con el problema mencionado. Saludos y gracias nuevamente.
 

Attachments

  • Compartamos.zip
    11.8 KB · Views: 164

Jannete

Member
Ese error lo tuve hace poco, y me di cuenta que era problema de la base datos que estaba corrupta.

la borre del sistema y volví a copiar, y el problema se soluciono.

pruebe este ejemplo:

esta comentado el borrado de la base de datos.

B4X:
Dim dbname As String = "chinook_v1.db"
   
'    If File.Exists(xui.DefaultFolder, dbname) = True Then
'        File.Delete(xui.DefaultFolder, dbname)
'    End If
   
    If File.Exists(xui.DefaultFolder, dbname) = False Then
        File.Copy(File.DirAssets, "chinook.db", xui.DefaultFolder, dbname)
    End If
   
    #if B4J
        'B4J SQL object can access many types of databases (same as B4A JdbcSQL).
        sql.InitializeSQLite(xui.DefaultFolder, dbname, False)
    #else
        sql.Initialize(xui.DefaultFolder, dbname, False)
    #End If

View attachment 131429
Muchas gracias por la respuesta, pero creo no estamos hablando de lo mismo. En el ejemplo dado, la base se copia, en mi caso el problema es crear la tabla desde ceros (sin un respaldo en assets). Anteriormente lo hice muchas veces, no se que ocurrio en esta ocasion. De hecho el proyecto inicio como ayuda a una persona y al mismo tiempo queria aprender yo a usar la b4xtable (en los ejemplos solo aparece el llenado de la tabla, yo quiero eliminar un registro, actualizar, etc).

Saludos!
 

TILogistic

Expert
Licensed User
Longtime User
Muchas gracias por la respuesta, pero creo no estamos hablando de lo mismo. En el ejemplo dado, la base se copia, en mi caso el problema es crear la tabla desde ceros (sin un respaldo en assets). Anteriormente lo hice muchas veces, no se que ocurrio en esta ocasion. De hecho el proyecto inicio como ayuda a una persona y al mismo tiempo queria aprender yo a usar la b4xtable (en los ejemplos solo aparece el llenado de la tabla, yo quiero eliminar un registro, actualizar, etc).

Saludos!
lo que trato de exponer, es que el error puede ser producto de que la base de datos esta corrupta en el sistema Android y produce el error al crear la tabla.

y para despegar las dudas es mejor verificar si existe borrarla antes de crearla.

Es lo que intento de explicar y el ejemplo que adjunte es para probar si tiene el mismo problema.

Edit:
Además, sugiero que suba un ejemplo del proyecto, para que podamos simular y verificar el error.

Saludos,
 
Last edited:

TILogistic

Expert
Licensed User
Longtime User
Hice pequeñas correcciones y usted puede seguir con su proyecto.

a la tabla banco modifique Id como PRIMARY KEY AUTOINCREMENT

y el error es porque la B4Xtable estaba cargando por primera vez ningún registro, agregue una condición para controlar el error.

Usted puede mejorarlo.
B4X:
Sub CargarTabla
  
    'Cargar la tabla con la base de datos
    Dim DataLIst As List
    DataLIst.Initialize
    'ID, Nombre, MontoTotal, PagoSemanal, Semana, Restante, Ahorro
    Dim rs As ResultSet = SQL1.ExecQuery("SELECT Id, Nombre, MontoTotal, PagoSemanal, Semana, Restante, Ahorro FROM banco")
    Do While rs.NextRow
        Dim row(7) As Object
        row(0) = rs.GetInt("Id")
        row(1) = rs.GetString("Nombre")
        row(2) = rs.GetDouble("MontoTotal")
        row(3) = rs.GetDouble("PagoSemanal")
        row(4) = rs.GetInt("Semana")
        row(5) = rs.GetDouble("Restante")
        row(6) = rs.GetDouble("Ahorro")
        DataLIst.Add(row)
    Loop
    If DataLIst.Size > 0 Then 
        B4XTable1.SetData(DataLIst)
    End If
    rs.Close
  
End Sub

1657954194299.png


PD:
En el diseño debe usar mejor los anclajes, hice algunas mejorar pero usted lo puede mejorar.
 

Attachments

  • Compartamos Lite.zip
    11.7 KB · Views: 173

Jannete

Member
Mil gracias, creo al final deje el codigo casi igual (el drop table no me servia ya que me borraba la tabla), pero al final por fin quedo. De nuevo mil gracias!!. Mi nuevo codigo quedo asi:

B4X:
'Copiar tabla sql a la memoria
    If FirstTime Then
        If File.Exists(RutaBase, NombreBD) Then
            SQL1.Initialize(RutaBase, NombreBD, True)
        Else
            'Log(File.Exists(RutaBase, NombreBD))
            SQL1.Initialize(xui.DefaultFolder, NombreBD, True)
            'SQL1.ExecNonQuery("DROP TABLE IF EXISTS banco")
            SQL1.ExecNonQuery("CREATE TABLE banco (Id INTEGER PRIMARY KEY AUTOINCREMENT, Nombre TEXT, MontoTotal DOUBLE, PagoSemanal DOUBLE, Semana INTEGER, Restante DOUBLE, Ahorro DOUBLE )")
        End If
    End If

Mi interes era poder mostrar en la B4XTable las tablas, porque anteriormente usaba un webview (solo un vez utilice la Table), ahora con la B4XTable se ve mas bonito, tiene filtros propios (deje de cargar el filtro manualmente), con un longclick puedo editar las casillas desde la misma tabla y quedo muy practico. Mil gracias nuevamente. Adjunto mi proyecto por si a alguien le sirve.

De nuevo muchas gracias por la ayuda dada. Saludos!!
 

Attachments

  • Proyecto B4XTable.zip
    11.8 KB · Views: 165
Top