Spanish Pruebas SQLite

digitalia

Member
Licensed User
Longtime User
Buenas tardes,

llevo unos días trastreando con SqLite y veo que pasa algo raro en el ejemplo que trae la guide "SQLExample" y es que si modifico un registro con el emulador, efectivamente se ve modificado en el emulador pero realmente en la base de datos no se modifica porque la abro con con varios administradores de bases de datos y no se ve modificado en las tablas ningún dato, sin embargo en el emulador sí se ve modificado.
He probado a reiniciar el basicandroid y el emulador y pasa lo mismo.

Será que el emulador memoriza internamente los cambios pero no ataca directamente a la base de datos

Realizando un seguimiento paso paso en modo Debug del código veo que el path de la base de datos o bien llamado en B4A:

DBFileName persons.db
DBFileDir: /data/data/B4A.SQLExample/files
DBTableName: persons

Ahora he encontrado que si habilito esta línea, me borra de la memoria del emulador la bd, solo para testear:

File.Delete(DBFileDir, DBFileName) ' used for testing, deletes the existing database

¿Pero no hay manera de ver como modifica datos realmente en una base de datos real no en una emulada?, es decir, si yo borro un campo desde el emulador que despues abra esa bd con un Sqlmanager(por ejemplo) y que ese registro haya desaparecido.

Gracias
 

Ecoleo

Member
Licensed User
Longtime User
Te aconsejo que "pases" del emulador y copies la bd de sqlite directamente al aparato que utilices, smartphone ó tableta. Yo lo hago así y me funciona perfectamente.
Saludos:)
 

digitalia

Member
Licensed User
Longtime User
Ok ya he metido la bd en una carpeta en la sd y he cambiado el path en el código. Conectar se conecta y me lee de la base de datos pero cuando quiero Modificar o Eliminar un registro me da error.

Me pone lo siguiente:

An error has ocurred in sub:
main_list_delete(B4A line:466)
Return I
android.database.sqlite.
SQLiteException:attempt to
write a readonly database:
DELETE FROM persons WHERE
ID= '8'
Continue?

Por lo que creo me dice que la Bd solamente es de lectura, pero mirando con un explorador de archivos que tenfo instalado en android me pone que el archivo "person.db" es de lectura y de escritura

Alguna sugerencia??
 

psdos

Active Member
Licensed User
Longtime User
Creo que te faltan los permisos adecuados para escribir en la SD. Prueba a poner esta variable que obligue a la compilacion a darle permisos de escritura a la SD. Sera una variable solo para los permisos, anque no la uses claro está.

B4X:
Dim a As String
a = File.DirRootExternal


Espero que esto te ayude, si no, busca en el foro ingles que hace unos dias vi un ejemplo completo de una agenda con base de datos SQL.

Un saludo.
 
Last edited:

digitalia

Member
Licensed User
Longtime User
Creo que te faltan los permisos adecuados para escribir en la SD. Prueba a poner esta variable que obligue a la compilacion a darle permisos de escritura a la SD. Sera una variable solo para los permisos, anque no la uses claro está.

B4X:
Dim a As String
a = File.DirRootExternal


Espero que esto te ayude, si no, busca en el foro ingles que hace unos dias vi un ejemplo completo de una agenda con base de datos SQL.

Un saludo.

Cierto Psdos, rebuscando por la mañana había encontrado una solución a este tema y es la que tú comentas, el enlace es éste:

http://www.b4x.com/forum/basic4android-updates-questions/16433-where-database.html

Y os pongo la solución por si alguien anda perdido:

Como lo tenía original:###################################

Aquí también había probado poniendo el path de la sd en DBFileDir pero me leía solamente no me dejaba modificar ni eliminar registros

If File.Exists(DBFileDir, DBFileName) = False Then
If FirstTime Then
File.Copy(File.DirAssets, DBFileName, DBFileDir, DBFileName)
SQL1.Initialize(DBFileDir, DBFileName, True)
End If
Else
If FirstTime Then
SQL1.Initialize(DBFileDir, DBFileName, True)
End If
End If

Timer1.Initialize("Timer1",100)

End Sub

Como lo tengo Ahora:####################################

If File.Exists(File.DirRootExternal , DBFileName) = False Then
If FirstTime Then
File.Copy(File.DirAssets, DBFileName, File.DirRootExternal, DBFileName)
SQL1.Initialize(File.DirRootExternal , DBFileName, True)
End If
Else
If FirstTime Then
SQL1.Initialize(File.DirRootExternal , DBFileName, True)
End If
End If
End Sub


Gracias y un saludo
 

digitalia

Member
Licensed User
Longtime User
You must comment out line 121:
B4X:
'    File.Delete(DBFileDir, DBFileName)    ' used for testing, deletes the existing database
Best regards.

Does this line is only for use in the emulator? In order to erase the database
 
Top