Spanish [SOLUCIONADO] SQL, me borra cosa rara

TheFalcon

Active Member
Licensed User
Longtime User
Buenas, ante todo, hace mucho que no paso por aqui. Estoy desesperado con una cosa rara que me pasas.
Yo copio unas .DB del PC al movil , se copian perfectamente en el Movil, pero cuando inicializo las tablas SIEMPRE em da error en 1 y me la borra de la carpeta Files
Deduzco que em dice que no Existe por que me la borra, pero no se por que solo es esa tabla de 5.
B4X:
android.database.sqlite.SQLiteCantOpenDatabaseException: Cannot open database '/storage/emulated/0/Android/data/Fjo.MandoCadesoft/files/TDesplegables.db' with flags 0x10: File /storage/emulated/0/Android/data/Fjo.MandoCadesoft/files/TDesplegables.db doesn't exist

Las inicializó asi , y antes de inicializar estan las 5 en Files

B4X:
        SQL_Familias.Initialize(File.DirDefaultExternal, "TFamilias.db", False)
        SQL_Articulos.Initialize(File.DirDefaultExternal, "TArticulos.db", False)
        SQL_Salones.Initialize(File.DirDefaultExternal, "TSalones.db", False)
        SQL_Dependientes.Initialize(File.DirDefaultExternal, "TDependientes.db", False)
        Sql_Desplegables.Initialize(File.DirDefaultExternal, "TDesplegables.db", False)

Se inicializan automáticamente en el Activity_Create.

Da igual el orden en que las descargue o las Inicialice, siempre es la misma tabla.

B4X:
Descargando: http://192.168.1.5:1980/Cadesoft/E1/TFamilias.db
Archivo descargado: TFamilias.db

Descargando: http://192.168.1.5:1980/Cadesoft/E1/TSalones.db
Archivo descargado: TSalones.db

Descargando: http://192.168.1.5:1980/Cadesoft/E1/TArticulos.db
Archivo descargado: TArticulos.db

Descargando: http://192.168.1.5:1980/Cadesoft/E1/TDesplegables.db
Archivo descargado: TDesplegables.db

Descargando: http://192.168.1.5:1980/Cadesoft/E1/TDependientes.db
Archivo descargado: TDependientes.db
Tamaño del TFamilias: 24576
Tamaño del TSalones: 147456
Tamaño del TArticulos: 327680
Tamaño del TDependientes: 16384
Tamaño del TDesplegables: 24576
Todas las descargas completadas
** Activity (main) Pause, UserClosed = false **
** Activity (ventas) Create (first time) **
Error occurred on line: 508 (Ventas)
android.database.sqlite.SQLiteCantOpenDatabaseException: Cannot open database '/storage/emulated/0/Android/data/Fjo.MandoCadesoft/files/TDesplegables.db' with flags 0x10: File /storage/emulated/0/Android/data/Fjo.MandoCadesoft/files/TDesplegables.db doesn't exist
    at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:275)
    at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:218)
    at android.database.sqlite.SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:535)
    at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:222)
    at android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:214)
    at android.database.sqlite.SQLiteDatabase.openInner(SQLiteDatabase.java:1163)
    at android.database.sqlite.SQLiteDatabase.open(SQLiteDatabase.java:1148)
    at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:1034)
    at android.database.sqlite.SQLiteDatabase.openDatabase(SQLiteDatabase.java:981)
    at anywheresoftware.b4a.sql.SQL.Initialize(SQL.java:44)
    at Fjo.MandoCadesoft.ventas$ResumableSub_Activity_Create.resume(ventas.java:904)
    at Fjo.MandoCadesoft.ventas._activity_create(ventas.java:752)
    at java.lang.reflect.Method.invoke(Native Method)
    at anywheresoftware.b4a.shell.Shell.runMethod(Shell.java:732)
    at anywheresoftware.b4a.shell.Shell.raiseEventImpl(Shell.java:351)
    at anywheresoftware.b4a.shell.Shell.raiseEvent(Shell.java:255)
    at java.lang.reflect.Method.invoke(Native Method)
    at anywheresoftware.b4a.ShellBA.raiseEvent2(ShellBA.java:157)
    at Fjo.MandoCadesoft.ventas.afterFirstLayout(ventas.java:105)
    at Fjo.MandoCadesoft.ventas.access$000(ventas.java:17)
    at Fjo.MandoCadesoft.ventas$WaitForLayout.run(ventas.java:83)
    at android.os.Handler.handleCallback(Handler.java:959)
    at android.os.Handler.dispatchMessage(Handler.java:100)
    at android.os.Looper.loopOnce(Looper.java:232)
    at android.os.Looper.loop(Looper.java:317)
    at android.app.ActivityThread.main(ActivityThread.java:8927)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:681)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:915)
Caused by: android.database.sqlite.SQLiteCantOpenDatabaseException: unknown error (code 14 SQLITE_CANTOPEN): Could not open database
    at android.database.sqlite.SQLiteConnection.nativeOpen(Native Method)
    at android.database.sqlite.SQLiteConnection.open(SQLiteConnection.java:237)
    ... 28 more
** Activity (ventas) Resume **

a ver si me podéis orientar por que no se que puede estar fallándome, es muy raro. Gracias
 

hatzisn

Expert
Licensed User
Longtime User
Use HxD hex editor and compare the downloaded file with the original.
 

hatzisn

Expert
Licensed User
Longtime User
Use HxD hex editor and compare the downloaded file with the original.

Also please use English. It is the english forum.
 

hatzisn

Expert
Licensed User
Longtime User
Also use File.DirInternal.
 

vecino

Well-Known Member
Licensed User
Longtime User
It doesn't say there's an error, it says “does not exist.”
How do you download it?
 

TheFalcon

Active Member
Licensed User
Longtime User
It doesn't say there's an error, it says “does not exist.”
How do you download it?

The file is copied from the PC, it copies all 5 files, but when it comes to initializing ONLY that database, it deletes it from the Files folder on the mobile and then gives the error.
 

TheFalcon

Active Member
Licensed User
Longtime User
Also use File.DirInternal.

I tried using DirInterna, and even saving to the Downloads folder on my mobile device, but it only happens with that database; I can copy and use the other four without problems.
 

josejad

Expert
Licensed User
Longtime User
Hola TheFalcon, qué de tiempo.
A primera vista parece que sería un problema de permisos (por las carpetas que usas), pero si copia las otras y van bien...
¿Qué línea es esta?: Error occurred on line: 508 (Ventas). ¿Es la línea Sql_Desplegables.Initialize(File.DirDefaultExternal, "TDesplegables.db", False) o es otra?

Una curiosidad, mezclas un poco los conceptos de tablas y bd. ¿Por qué usas 5 bases de datos y no una con todas las tablas?

saludos,
 

TheFalcon

Active Member
Licensed User
Longtime User
Hola TheFalcon, qué de tiempo.
A primera vista parece que sería un problema de permisos (por las carpetas que usas), pero si copia las otras y van bien...
¿Qué línea es esta?: Error occurred on line: 508 (Ventas). ¿Es la línea Sql_Desplegables.Initialize(File.DirDefaultExternal, "TDesplegables.db", False) o es otra?

Una curiosidad, mezclas un poco los conceptos de tablas y bd. ¿Por qué usas 5 bases de datos y no una con todas las tablas?

saludos,
buenas Jose, cuanto tiempo un placer como siempre, copio las 5 por que es un programa que uso en PC y esas 5 bases de datos tienen distintas tablas que ya uso en el programa, y las paso al movil para agilizar las consultas, por eso son varias. el error viene a la hora de inicializar esa Tabla que me da error, las otras las inicializa sin problemas, y da igual en que orden las copie o inicialice siempre es ESA base de datos. justo cuando da ESE ERROR , hago una parada y la tabla existe en FILES del movil, pero por lo visto al ir a inicializarla me la borra del movil y da el error
 

josejad

Expert
Licensed User
Longtime User
Y algo del código podrías poner?
 

vecino

Well-Known Member
Licensed User
Longtime User
Yo la he abierto normalmente, sin ningún problema, ¿será que tienes puesto el nombre distinto en las mayúsculas/minúsculas?
 

TheFalcon

Active Member
Licensed User
Longtime User
Y algo del código podrías poner?
Aqui los descargo del PC a la carpeta Defaultexternal del movil, aunque me vale cualquiera. y Todo OK

B4X:
Sub DescargarArchivo(indice As Int)
    empresa = "E1"
    If indice >= totalArchivos Then
        Log("Todas las descargas completadas")
        ToastMessageShow("Programación Finalizada",False)
       
        btIniciar.Enabled = True 'hasta que no descargo todo no se habilita si le di a programar
        Return
    End If
   
    Dim f As String = archivos_descargar(indice)
    Dim j As HttpJob
    j.Initialize(f, Me)
   
    Dim url As String = "http://" & servidor_Config & ":1980/Cadesoft/" & empresa & "/" & f
    Log("Descargando: " & url)
   
    ' Timeout largo para archivos grandes
    j.GetRequest.Timeout = 60000
    j.Download(url)
End Sub




B4X:
    If j.Success Then
        ' Guardar archivo
   
        File.Copy2(j.GetInputStream, File.OpenOutput(File.DirDefaultExternal, j.JobName, False))
        Log("Archivo descargado: " & j.JobName)
       
        Log("Tamaño del TFamilias: " & File.Size(File.DirDefaultExternal, "TFamilias.db"))
        Log("Tamaño del TSalones: " & File.Size(File.DirDefaultExternal, "TSalones.db"))
        Log("Tamaño del TArticulos: " & File.Size(File.DirDefaultExternal, "TArticulos.db"))
        Log("Tamaño del TDependientes: " & File.Size(File.DirDefaultExternal, "TDependientes.db"))
        Log("Tamaño del TDesplegables: " & File.Size(File.DirDefaultExternal, "TDesplegables.db"))
       
   
        ' Lanzar la siguiente descarga
        archivosDescargados = archivosDescargados + 1
        DescargarArchivo(archivosDescargados)
    Else
        Log("Error descargando " & j.JobName & ": " & j.ErrorMessage)
    End If
    j.Release





En el Main:
    If File.Exists(File.DirDefaultExternal, "TSalones.db") = True Then tabla_salon = True Else tabla_salon = False
      
    If File.Exists(File.DirDefaultExternal, "TArticulos.db") = True Then tabla_articulo = True Else tabla_articulo = False
      
    If File.Exists(File.DirDefaultExternal, "TFamilias.db") = True Then tabla_familia = True Else tabla_familia = False
      
    If File.Exists(File.DirDefaultExternal, "TDesplegables.db") = True Then tabla_desplegable = True Else tabla_desplegable = False
  
    If File.Exists(File.DirDefaultExternal, "TDependientes.db") = True Then tabla_Depend = True Else tabla_Depend = False
  
  
    If File.Exists(File.DirDefaultExternal, "TConfiguracion.db") = True Then Tabla_Configuracion = True Else Tabla_Configuracion = False

 
    Log("Tamaño del TFamilias: " & File.Size(File.DirDefaultExternal, "TFamilias.db"))
    Log("Tamaño del TSalones: " & File.Size(File.DirDefaultExternal, "TSalones.db"))
    Log("Tamaño del TArticulos: " & File.Size(File.DirDefaultExternal, "TArticulos.db"))
    Log("Tamaño del TDependientes: " & File.Size(File.DirDefaultExternal, "TDependientes.db"))
    Log("Tamaño del TDesplegables: " & File.Size(File.DirDefaultExternal, "TDesplegables.db"))
    Log("Tamaño del TConfiguracion: " & File.Size(File.DirDefaultExternal, "TConfiguracion.db"))

Luego en el Modulo que los Uso En su activity create


B4X:
        SQL_Familias.Initialize(File.DirDefaultExternal, "TFamilias.db", False)
        SQL_Articulos.Initialize(File.DirDefaultExternal, "TArticulos.db", False)
        SQL_Salones.Initialize(File.DirDefaultExternal, "TSalones.db", False)
        SQL_Dependientes.Initialize(File.DirDefaultExternal, "TDependientes.db", False) 'v10.8
        Sql_Desplegables.Initialize(File.DirDefaultExternal, "TDesplegables.db", False) 'v2. 2026
        SQL1.Initialize(File.DirDefaultExternal, "TConfiguracion.db", False)

y aquí me da el error al Inicializar Desplegables, añadi una nueva TConfiguracion y también la recoge e inicializa bien.

PD:Si quito INICIALIZARLA desde Activity create, peor la Inicializo cuando la voy a usar me da el mismo error. siempre al inicializarla

Pasa una cosa curiosa, que no tiene nada que ver pero em choca, si DESINSTALO LA APP y la instalo me genera las bases de datos automáticamente.
 
Last edited:

josejad

Expert
Licensed User
Longtime User
si DESINSTALO LA APP y la instalo me genera las bases de datos automáticamente
Esto es raro, debería pasar si el último parámetro de Initialize fuera TRUE

Del tutorial de SQL
The SQL1 object will only be initialized once when the process starts.
In our case we are creating it in the sd card. The last parameter (CreateIfNecessary) is True so the file will be created if it doesn't exist.

¿Puedes poner a TRUE el initialize de la tabla que te falla? No debería dar error aunque la tabla debería estar vacía.

If j.Success Then
No deberías tener este evento, deberías hacerlo con un Wait for. Prueba a descargarlas correctamente:

Descargar varios elementos:
Sub Activity_Create(FirstTime As Boolean)
   DownloadMany(Array("http://www.google.com", "http://duckduckgo.com", "http://bing.com"))
End Sub

Sub DownloadMany (links As List)
   For Each link As String In links
     Dim j As HttpJob
     j.Initialize("", Me) 'name is empty as it is no longer needed
     j.Download(link)
     Wait For (j) JobDone(j As HttpJob)
     If j.Success Then
       Log("Current link: " & link)
       Log(j.GetString)
     End If
     j.Release
   Next
End Sub


 
Last edited:

TheFalcon

Active Member
Licensed User
Longtime User
Si pongo a True, me la crea al inicializarla pero me da error por que no encuentra la Tabla que intento consultar.
Probé con Waitfor y tampoco, compruebo cuando se descarga hasta el tamaño y tiene.

He probado a ANTES de inicializarla hacer una copia yinicializar esa y nada.
B4X:
    If File.Exists(File.DirDefaultExternal, "TDesplegables.db") = True Then
        File.Copy(File.DirDefaultExternal, "TDesplegables.db", File.DirDefaultExternal, "TDesplegables2.db")
end if

Voy a probar a crear la Base de datos de 0. a ver si tiene algo raro por que no es normal
 

chej

Member
Buenas.
Te paso el código, capaz que te sirva para probar, que utilizo para abrir una base de datos con varias tablas dentro y se descarga por ftp:

B4X:
Sub Class_Globals
    Dim mDATOS As SQL
    Dim mNombre As String
    Dim mPath As String
    Dim mError As String
End Sub

'Inicializa el objeto, se pasa el nombre de la base de datos
'Ejemplo:<code>Initialize( "XXX.DB" )
'</code>
Public Sub Initialize ( Base_de_Datos As String )

    mError = ""
    
    Private rp As RuntimePermissions
    mPath = rp.GetSafeDirDefaultExternal ("datos")
    

    Try
        mDATOS.Initialize( mPath, Base_de_Datos, False)
        mNombre = Base_de_Datos   
    Catch
        Dim Error As Exception
        Error = LastException()
        mError = "Error al conectar con " & Base_de_Datos & "(" & mPath & "): " & Error.Message
        mNombre=""
    End Try

End Sub

Saludos
 

TheFalcon

Active Member
Licensed User
Longtime User
Subo mi proyecto ENTERO, que pidió Jose, para verlo no tengo nada especial que no se pueda saber, eso si explico donde esta el error por que son muchas Líneas y muchos comentarios y para que no os volváis locos.

https://we.tl/t-TnZai0Sgof


Comento:

Se ha de meter la carpeta Cadesoft en C del ordenador. y ejecutar el servidor python que es lo que uso para escribir en las Bases de datos del PC y para descargarme las que necesito al movil.

al INICIAR la app has de poner la IP de tu ordenador en la configuración

Luego darle a PROGRAMAR para que copie las Bases de datos del PC al movil

Iniciar el Servidor Python

Una vez te arranque pincha en cualquier mesa , si te da error de conexion espera un momento que haga el 1º ping.


Cuando entres en una mesa Pincha arriba en Bebidas y aparecerán los artículos.

el articulo que da error es "articulo lista" que es el que al pincharlo INICIALIZA el Tdesplegable, que esta en la ACTIVITY VENTAS Linea 6250

Tambien la intento INICIALIZAR al arrancar el activity ventas pero tambien me daba error , en la linea 546 junto al resto de tablas.

Muchas gracias
 
Last edited:

TheFalcon

Active Member
Licensed User
Longtime User
Buenas.
Te paso el código, capaz que te sirva para probar, que utilizo para abrir una base de datos con varias tablas dentro y se descarga por ftp:

B4X:
Sub Class_Globals
    Dim mDATOS As SQL
    Dim mNombre As String
    Dim mPath As String
    Dim mError As String
End Sub

'Inicializa el objeto, se pasa el nombre de la base de datos
'Ejemplo:<code>Initialize( "XXX.DB" )
'</code>
Public Sub Initialize ( Base_de_Datos As String )

    mError = ""
   
    Private rp As RuntimePermissions
    mPath = rp.GetSafeDirDefaultExternal ("datos")
   

    Try
        mDATOS.Initialize( mPath, Base_de_Datos, False)
        mNombre = Base_de_Datos  
    Catch
        Dim Error As Exception
        Error = LastException()
        mError = "Error al conectar con " & Base_de_Datos & "(" & mPath & "): " & Error.Message
        mNombre=""
    End Try

End Sub

Saludos
Lo pruebo ahora mismo y te digo, gracias
 
Top