Spanish File.DirRootExternal o File.DirInternal

Miguel Santillan

Member
Licensed User
Tengo problemas al intentar grabar en mi android en la base de datos Sqlite.
Como mi base debe iniciarse todos los días vacía, ejecuto un procedimiento que realiza lo siguiente.

File.Copy(File.DirAssets, "xxxx.db",File.DirRootExternal, "hhhh.db")

El problema es que mas de una vez el proceso no actualiza la base hhhh.db y no da ningún error.
No se si está bien hacerlo con ,File.DirRootExternal o se debe hacer con File.DirInternal .
Donde se debe grabar no lo tengo muy claro y si me pueden ayudar aclarando este tema se los agradecería.

Saludos.
Miguel
 

edgar_ortiz

Active Member
Licensed User
Longtime User
Miguel,

En lo personal copio la base de datos a "File.DirDefaultExternal" y por aquello de la versión del sistema operativo se verifican los permisos

B4X:
    Dim rp As RuntimePermissions
    '
    If rp.GetSafeDirDefaultExternal("") <> File.DirDefaultExternal Then
        Log("Please post: " & rp.GetSafeDirDefaultExternal(""))
        Log(File.DirDefaultExternal)
    Else
        Log("Nothing interesting")
    End If

Saludos,

Edgar
 

drgottjr

Expert
Licensed User
Longtime User
Como mi base debe iniciarse todos los días vacía, ejecuto un procedimiento que realiza lo siguiente.

File.Copy(File.DirAssets, "xxxx.db",File.DirRootExternal, "hhhh.db")

todos los dias estas borrando tu base de datos... antes de copiar la bd de file.dirassets a rp.GetSafeDirDefaultExternal(""), tienes que averiguar su existencia en
rp.GetSafeDirDefaultExternal("") primero. si existe, no la copias.

y como ha sugerido, e. ortiz, nunca has de usar file.dirdefaultexternal. en la proximas versiones de android, no va a ser posible. usa
rp.GetSafeDirDefaultExternal("") o, mejor, file.dirinternal.
 

Miguel Santillan

Member
Licensed User
Justamente lo que quiero hacer es que la base quede en blanco cada vez que se ejecute este procedimiento debido a que luego actualizo las tablas.

La primera vez que lo corro, TODO ESTA BIEN.
La segunda vez me da un error
ERROR CODE : 1032 (SQLITE_READONLY_DBMOVED)


EL CODIGO ES EL SIGUIENTE
B4X:
    rp.CheckAndRequest(rp.PERMISSION_WRITE_EXTERNAL_STORAGE)
    Wait For Activity_PermissionResult (Permission As String, Result As Boolean)
    
    If rp.GetSafeDirDefaultExternal("") <> File.DirDefaultExternal Then
        Log("Please post: " & rp.GetSafeDirDefaultExternal(""))
        Log(File.DirDefaultExternal)
    Else
        Log("Nothing interesting")
    End If
    
    File.Copy(File.DirAssets, "db_cerca.db", File.DirDefaultExternal, "db_cerca.db")
    
    If SQL1.IsInitialized = False Then
        SQL1.Initialize(File.DirDefaulTExternal,"db_cerca.db",True)
    End If
    
    LblTipo.Text = "Preparando actualizacion de Archivos"
    LblTipo.Color = Colors.Blue
    LblTipo.TextColor = Colors.Yellow

    Dim X_Clave_parametro As String = "MS"
    Dim X_Peddo_parametro As Int = 0
    
    Dim Usuario As String
    Usuario = ""
    Dim Registro As Cursor
    Registro = SQL1.ExecQuery("select usuario from parametros where clave = '" & X_Clave_parametro.Trim & "'")
    For n = 0 To Registro.RowCount - 1
        Registro.Position = n
        Usuario = Registro.GetString("usuario")
'        Log("Busco Usuario:" & Usuario)
    Next
    If Usuario = "" Then
        Log("no existe usuario")
        SQL1.ExecNonQuery("INSERT INTO parametros(clave, numero_pedido, usuario) VALUES('" & X_Clave_parametro.Trim & "'," & X_Peddo_parametro & ",'" & login.id_usuario.Trim & "')")
    Else
        SQL1.ExecNonQuery("UPDATE parametros set usuario = '" & login.id_usuario.Trim & "' where clave = '" & X_Clave_parametro.Trim & "'")
    End If
    
    SQL1.ExecNonQuery("delete from usuarios")
    SQL1.ExecNonQuery("INSERT INTO usuarios(usuario, clave, nombre) VALUES('" & login.id_usuario.Trim & "','" & X_Clave_parametro.Trim & "','" & login.nombre_usuario.Trim & "')")
 

drgottjr

Expert
Licensed User
Longtime User
mira, yo uso sqlite. copio la bd cuando no existe en la carpeta idonea. muchos lo hacemos.
segun sqlite:
(1032) SQLITE_READONLY_DBMOVED
The SQLITE_READONLY_DBMOVED error code is an extended error code for SQLITE_READONLY. The SQLITE_READONLY_DBMOVED error code indicates that a database cannot be modified because the database file has been moved since it was opened, and so any attempt to modify the database might result in database corruption if the processes crashes because the rollback journal would not be correctly named.

tengo la impresion que comprendes el ingles, pero, por si acaso, dice sqlite que la db la estas abriendo (initialize) primero y luego intentas copiarla. no se, pues solo se ve un poco de tu codigo. si lo que quieres es, que cada sesion empiece con una db vacia, ? porque no la creas dentro de la app? sin necesidad de copiarla (aunque la documentacion de sqlite se refiere a "mudar" la db. francamente, mudar es una cosa, copiar otro.) o hay un error en tu codigo (que no se ve aqui) y has de buscarlo, o prueba crear la db dentro de la misma app.

y, nota que todavia te refieres a file.dirdefaultexternal in file.copy(). te vas a arrepentir de ello muy pronto.

una cosa para terminar: lee esto presenta muchas posibilidades referente al mismo error. quiza no se aplique en tu caso, pero no conocemos tu codigo.
 

gregorio_adrian_gimenez

Active Member
Licensed User
Longtime User
Yo guardo la base de datos en Dir Internal cuando se desinstala la app se borra la base de datos.

Para reelmplazarla puedes hacer así

base de datos:
If File.Exists(File.DirInternal, "XXXXX.db") = False Then
        'if not, initialize it
        SQL1.Initialize(File.DirInternal, "XXXXXXX.db", True)
        'and create it
        CreateDataBase
    Else
        File.Delete(File.DirInternal, "XXXXXXXX.db")
        
        SQL1.Initialize(File.DirInternal, "XXXXXXX.db", True)
        CreateDataBase
    End If
    
Private Sub CreateDataBase
    Private Query As String
    
    Query = "CREATE TABLE nombre_tabla (.....))"
    SQL1.ExecNonQuery(Query)
    Sleep(1)
        
    
End Sub
 
Top