B4A en español - Juan Antonio Villalpando
(BASIC4Android)
-- Tutorial de B4A --
Volver al índice del tutorial
____________________________
57B- SQLite.
Para guardar información se suelen utilizar tablas (matrices, arrays), archivos de textos y bases de datos.
Las bases de datos utilizadas suelen ser:
- MySQL que guarda la información en un servidor de Internet.
- SQLite que guarda la información en el móvil.
- Vamos a ver SQLite.
SQLite lo compone un archivo que suele tener la extensión mibase.sql o mibase.db.
En una base de datos hay tablas, por ejemplo en la base de datos empresa.sql puede tener las tablas: empleados, productos, compras, ventas.
En cada tabla hay columnas llamada campos y filas llamadas registros.
Tabla: empleados
empleados |
campo |
campo |
campo |
campo |
registro |
id |
nombre |
apellido |
edad |
registro |
1 |
Juan |
Jiménez |
32 |
registro |
2 |
Pedro |
González |
34 |
registro |
3 |
Luis |
Sánchez |
23 |
registro |
4 |
Antonio |
Pérez |
48 |
registro |
5 |
Carlos |
Martínez |
51 |
Hay un campo que se suele denominar Id que se toma como referencia (aunque no es obligatorio).
La información de cada celda se denomina dato.
_______________________________________________________
- Creación de la estructura de la base de datos.
Podemos crear la estructura de la base de datos en el mismo código o crearla previamente con una aplicación tal como SQLite Data Browser (sqlitebrowser_200_b1_win.zip) .
1.- Por códigos
Aquí presento códigos simples para crear la tabla, insertar datos, seleccionar, borrar, actualizar, ordenar...
Crea una tabla llamada empleados.
CREATE TABLE empleados (id INTEGER PRIMARY KEY, nombre TEXT, apellido TEXT, edad INT);
SQL1.ExecNonQuery( "CREATE TABLE empleados (id INTEGER PRIMARY KEY, nombre TEXT, apellido TEXT, edad INTEGER) " )
Inserta datos
nota: unas veces he puesto la edad con int y otras con text, modificarlo según convenga.
Cuidado que los text van con 'comilla simple' y los int van sin comillas.
INSERT INTO empleados (id,nombre,apellido,edad) VALUES (6, 'Ana', 'González', '22' );
SQL1.ExecNonQuery("INSERT INTO empleados VALUES(6, 'Ana', 'Gonzalez', 22")
SQL1.ExecNonQuery("INSERT INTO empleados VALUES('" & otraId & "','" & nombre & "','" & apellido & "','" & edad & "')")
CUIDADO con las comillas "dobles" las 'simples' y cuando están las "'dos'"
Borrar tabla
DROP TABLE empleados;
SQL1.ExecNonQuery("DROP TABLE empleados")
SQL1.ExecNonQuery("DELETE FROM empleados")
Selecciona nombre y edad
SELECT nombre, edad FROM empleados;
registro = SQL1.ExecQuery("SELECT nombre, edad FROM empleados")
Selecciona todos los campos
SELECT * FROM empleados;
registro = SQL1.ExecQuery("SELECT * FROM empleados")
Selecciona los empleados cuya edad es mayor de 32
SELECT * FROM empleados WHERE edad > 32;
registro = SQL1.ExecQuery("SELECT * FROM empleados WHERE edad > 32 ")
Selecciona los empleados cuya edad es mayor de x (x es una variable)
registro = SQL1.ExecNonQuery("SELECT * FROM empleados WHERE edad > '" & x & "' ")
Selecciona los empleados cuya edad es igual a 32
SELECT * FROM empleados WHERE edad = 32;
Selecciona los empleados cuya edad no es igual a 32
SELECT * FROM empleados WHERE edad != 32;
Selecciona los empleados cuya edad sea mayor o igual de 32
SELECT * FROM empleados WHERE edad >= 32;
Selecciona los empleados cuya edad sea mayor o igual de 32 y tenga de nombre Juan
SELECT * FROM empleados WHERE edad >= 32 AND nombre = 'Juan';
Selecciona los empleados cuya edad sea mayor o igual de 32 o tenga de nombre Juan
SELECT * FROM empleados WHERE edad >= 32 OR nombre >= 'Juan';
Selecciona los empleados cuya nombre comience por 'Ju' (los comodines son % y _)
SELECT * FROM empleados WHERE nombre LIKE 'Ju%'; Comodines % _
Selecciona los empleados cuya edad sea 32 o 40
SELECT * FROM empleados WHERE edad IN (32, 40);
Selecciona los empleados cuya edad esté entre 32 y 40
SELECT * FROM empleados WHERE edad BETWEEN 32 AND 40;
Modifica el nombre en el registro id 1
UPDATE empleados SET nombre = 'Juana' WHERE id = 1;
SQL1.ExecNonQuery("UPDATE empleados set nombre ='Juana' WHERE id = 1")
Modifica el nombre en el registro id (id es una variable)
SQL1.ExecNonQuery("UPDATE empleados set nombre ='"& nombre &"',telefono ='"& apellido &"' WHERE Id = " & id)
Borra el registro id 4
DELETE FROM empleados WHERE id = 4;
SQL1.ExecNonQuery("DELETE FROM empleados WHERE id =4")
Borra el registro id (id es una variable)
SQL1.ExecNonQuery("DELETE FROM empleados WHERE id = '" & id & "' ")
Ordena empleados por nombre Ascendente
SELECT * FROM empleados ORDER BY nombre ASC;
SQL1.ExecNonQuery("SELECT * FROM empleados ORDER BY nombre ASC")
Ordena empleados por edad Descendente
SELECT * FROM empleados ORDER BYedad DESC;
SQL1.ExecNonQuery("SELECT * FROM empleados ORDER BY edad DESC ")
2.- Creación de la base de datos mediante SQLite Data Browser
Creo que para empezar es mejor crear la base de datos mediante SQLite Data Browser. (sqlitebrowser_200_b1_win.zip) Vamos a crear una base de datos llamada empresa.sql con una sola tabla llamada empleados y con los campos vistos anteriormente: id, nombre, apellido, edad.
- Respetar mayúsculas y minúsculas.
- No poner acentos ni eñes en el nombre de campo.
- El campo id lo ponemos como INTEGER_PRIMARY_KEY.
- Todos los demás campos los ponemos como TEXT (incluso el de edad). En este ejemplo he puesto la edad como texto, no como entero.
- Para hacer los ejemplos mejor no poner acentos en los datos.
NOTA: El tipo BLOB es para guardar imágenes.
Pulsamos en Browser Data. Luego en New Record. Después doble pulsación sobre cada celda.
Añadimos un Dato y pulsamos en Apply Change.
De esta manera rellenamos los datos de la tabla.
Consulta... View / SQL Log.
Aquí la tienes... empresa.sql cópiala en la carpeta Files.
_______________________________________________________
- Aplicaciones.
Bien... vamos a realizar aplicaciones simples con SQLite.
La base de datos empresa.sql la copiamos en la carpeta Files del proyecto. Recuerda que la carpeta Files (DirAsset), durante la ejecución de la aplicación, es de solo lectura, es decir no podemos modificar la base empresa.sql, que se encuentra en Files (DirAsset), desde la aplicación.
Por eso cuando comienza la aplicación lo primero que hace es consultar si empresa.sql se encuentra ya en la sdcard, en caso que no se encuentre se copia. Si ya está en la sdcard (DirRootExternal), continua el programa. Es decir, cuando modifiquemos empresa.sql, se modificará en la sdcard (DirRootExternal), pero no la que tenemos en Files (DirAsset).
Si haciendo las pruebas has borrado todos los datos y quieres empezar de nuevo, activa esta línea...
' File.Delete(File.DirRootExternal, "empresa.sql")
para que se vuelva a cargar la base de datos con los registros iniciales desde DirAsset a DirRootExternal.
Luego debes volver a deshabilitar esa línea y reiniciar la aplicación.
- Tomar la base de datos del Android y llevarla a Windows.
Abrimos un Terminal mediante el comando "cmd". Nos posicionamos en la carpeta donde esté el adb, probablemente...
C:\Android\android-sdk\platform-tools
cd C:\Android\android-sdk\platform-tools
C:\Android\android-sdk\platform-tools> adb shell
# cd /mnt/sdcard
# ls
empresa.sql
# cat empresa.sql
|
Para pasar el archivo empresa.sql desde la SdCard a un archivo de Windows, abrimos otro terminal mediante el "cmd".
cd C:\Android\android-sdk\platform-tools
C:\Android\android-sdk\platform-tools> adb -e pull "/mnt/sdcard/empresa.sql" "C:/Android/empresa.sql"
|
______________________________________
- Búsqueda del último registro existente.
Para buscar el último registro, para luego añadir el siguiente, podemos hacerlo de esta manera...
' Busca el último Registro
registro = SQL1.ExecQuery("SELECT id FROM usuarios")
If registro.RowCount > 0 Then
For n = 0 To registro.RowCount - 1
registro.Position = n
Dim otraId As Int
otraId = registro.GetInt("id")
Next
En otraId tendríamos la id del último registro.
Pero es más sencillo hacerlo de esta otra manera... (utilizaremos esta forma)
' Busca el último Registro
otraId = SQL1.ExecQuerySingleResult("SELECT Max(id) FROM empleados")
- Con esta otra forma obtendría el último registro id introducido, pero no es necesariamente el último registro existente
' Busca el último Registro introducido
otraId2 = SQL1.ExecQuerySingleResult("SELECT last_insert_rowid() As id FROM empleados")
- Una subrutina para comprobar cuántos registros hay almacenado.
Sub Cuantos
' Cuantos
cReg = SQL1.ExecQuerySingleResult("SELECT count(*) FROM empleados")
If cReg > 0 Then
Msgbox("Si hay registro: " & cReg,"")
Else
Msgbox("No existen registros", "")
End If
End Sub
- Reconstruir el índice id de la base de datos.
Las bases de datos suelen tener una columna en donde se encuentra un índice numérico que se utiliza para elegir cada registro.
Este número debe ser único para cada registro.
Cuando añadimos registros a la base de datos el índice irá tomando los números: 1, 2, 3, 4, 5, 6, 7, 8.
Pero cuando borramos registros intermedios los índices quedarán: 1, 3, 6, 7.
No tiene importancia que los índices no sean números correlativos, ya que lo importante es que cada registro tenga un número único.
Sin embargo nos puede interesar reconstruir esos índices cada vez que no sean correlativos, para que vuelvan a quedar: 1, 2, 3, 4.
Hay una orden que debe reconstruir esos índices: SQL1.ExecNonQuery("REINDEX empleados") pero no ha funcionado.
Así que en el Button6 creo este código que reconstruye las id
Sub Button6_Click
' Reconstruye las id
Dim tomaid, t As Int
registro = SQL1.ExecQuery("SELECT id FROM empleados")
For n = 0 To registro.RowCount - 1
t = n + 1
registro.Position = n
tomaid=registro.getString("id")
SQL1.ExecNonQuery("UPDATE empleados set id ='"& t &"' WHERE id = '" & tomaid & "' ")
Next
Carga_BD_en_ListView
' SQL1.ExecNonQuery("REINDEX empleados") ' No funciona así
End Sub
- Relleno.
Observamos que las filas del ListView aparecen de esta manera
1 | Juan | Jiménez | 32
2 | Pedro | González | 34
3 | Luis | Sánchez | 23
No salen perfectamente encolumnados.
Realizo una Subrutina para rellenar con espacios en blanco a la derecha de cada campo para que todos los campos tengan la misma anchura.
Sub Relleno (frase As String, longitud As Int ) As String
Dim lleno As String
For n = 0 To longitud
lleno = lleno & " "
Next
' Espacios a derecha
frase = frase & lleno
frase = frase.substring2(0, longitud)
' Espacios a izquierda
'frase = lleno & frase
'frase = frase.SubString2(frase.Length - longitud, frase.Length)
Return frase
End Sub
A esta Subrutina la llamo indicando la variable a la que se lo quiero aplicar y el número de espacios a la derecha de debe tener.
nombre = registro.GetString("nombre") : nombre = Relleno(nombre,10)
edad = registro.GetString("edad") : edad = Relleno(edad,2)
Pero no llega a funcionar perfectamente, ya que los caracteres tienen ancho distinto.
Con otros métodos como con CustomListView se puede conseguir. Aquí hay un código para poner un ListView con dos columnas.
También utilizando arrays de view como se ha visto en un tutorial anterior.
Pero en nuestro caso lo dejamos así ya que no se quiere complicar el código.
_______________________________________________________
_______________________________________________________
1.- Código y Layout de nuestra primera aplicación.
Mediante el Designer creamos un Layout, lo llamaremos "Layout" y contendrá:
Label1 ...... id
Label2....... Nombre
Label3....... Apellido
Label4....... Edad
EditText1
EditText2
EditText3
ListView1
Button1..... Añadir
Button2 .... Borrar
Button3 .... Editar
Button4..... <<
Button5..... >>
Button6.... Re
Copia empresa.sql en la carpeta Files
|
|
Copia y pega este código en un nuevo proyecto |
#Region Project Attributes
#ApplicationLabel: SQLite-juan
#VersionCode: 1
#VersionName:
'SupportedOrientations possible values: unspecified, landscape or portrait.
#SupportedOrientations: unspecified
#CanInstallToExternalStorage: False
#End Region
#Region Activity Attributes
#FullScreen: False
#IncludeTitle: True
#End Region
Sub Process_Globals
' Juan Antonio Villalpando
' juana1991@yahoo.com
' febrero 2013 y abril 2014
Dim SQL1 As SQL
End Sub
Sub Globals
Dim registro As Cursor
Dim Label1 As Label
Dim EditText1, EditText2, EditText3 As EditText
Dim id, nombre, apellido, edad As String
Dim otraId As Int
Dim ListView1 As ListView
Dim k As Int
k = 0
End Sub
Sub Activity_Create(FirstTime As Boolean)
' Si queremos borrar la base de datos de la sdcard para empezar de nuevo
' cargando la inicial de File.DirAssets
' File.Delete(File.DirRootExternal, "empresa.sql")
Activity.LoadLayout("Layout")
If File.Exists(File.DirRootExternal,"empresa.sql") = False Then
' Ponemos una base inicial de datos en la carpeta Files.
' Luego la copiamos a la SD Card
File.Copy(File.DirAssets,"empresa.sql",File.DirRootExternal,"empresa.sql")
End If
If SQL1.IsInitialized = False Then
SQL1.Initialize(File.DirRootExternal, "empresa.sql", False)
End If
' Llama a la Subrutina para cargar la base de datos en el ListView1
Carga_BD_en_ListView
Activity.Title="© Juan A. Villalpando"
End Sub
Sub Activity_Resume
End Sub
Sub Activity_Pause (UserClosed As Boolean)
End Sub
Sub Carga_BD_en_ListView
' Limpia el ListView1
ListView1.Clear
' Carga toda la tabla empleados de la empresa.sql en registro
registro = SQL1.ExecQuery("SELECT * FROM empleados")
For n = 0 To registro.RowCount - 1
registro.Position = n
' Relleno, rellena con espacio a la derecha cada campo
' No sale bien presentado, mejor utilizar CustomListView
id = registro.GetString("id"):' id = Relleno(id,2)
nombre = registro.GetString("nombre") : nombre = Relleno(nombre,10)
apellido = registro.GetString("apellido") : apellido = Relleno(apellido,10)
edad = registro.GetString("edad"): edad = Relleno(edad,2)
ListView1.AddSingleLine(id & "|" & nombre& "|" & apellido & "|" & edad)
ListView1.SingleLineLayout.ItemHeight = 40
ListView1.SingleLineLayout.Label.TextSize = 20
ListView1.SingleLineLayout.Label.TextColor = Colors.Black
ListView1.SingleLineLayout.Label.Color = Colors.White
Next
End Sub
Sub Button1_Click
' Añadir Registro
nombre = EditText1.Text
apellido = EditText2.Text
edad = EditText3.Text
If nombre = "" OR apellido = "" OR edad = "" Then
Msgbox("Debes escribir el nombre, el apellido y la edad.","Faltan datos.")
Else
' Busca el último Registro
otraId = SQL1.ExecQuerySingleResult("SELECT Max(id) FROM empleados")
' Crea un nuevo Registro
otraId = otraId + 1
SQL1.ExecNonQuery("INSERT INTO empleados VALUES('" & otraId & "','" & nombre & "','" & apellido & "','" & edad & "')")
' Llama a la Subrutina para cargar la base de datos en el ListView1
Carga_BD_en_ListView
Label1.Text = "id"
EditText1.Text = ""
EditText2.Text = ""
EditText3.Text = ""
EditText1.RequestFocus
End If
End Sub
Sub Button2_Click
' Borrar Registro
SQL1.ExecNonQuery("DELETE FROM empleados WHERE id = '" & id & "' ")
' Llama a la Subrutina para cargar la base de datos en el ListView1
Carga_BD_en_ListView
Label1.Text = "id"
EditText1.Text = ""
EditText2.Text = ""
EditText3.Text = ""
End Sub
Sub Button3_Click
' Editar Registro
Label1.Text="id "
nombre = EditText1.Text
apellido = EditText2.Text
edad = EditText3.Text
If nombre = "" OR apellido = "" OR edad = "" Then
Msgbox("Debes rellenar todos los campos con datos.","Campos vacíos.")
Else
SQL1.ExecNonQuery("UPDATE empleados SET nombre ='"& nombre &"',apellido ='"& apellido &"',edad ='"& edad &"' WHERE id = " & id)
' Llama a la Subrutina para cargar la base de datos en el ListView1
Carga_BD_en_ListView
End If
End Sub
Sub Button4_Click
' Atrás
k = k - 1
If k < 0 Then k = 0
' registro = SQL1.ExecQuery("SELECT * FROM empleados WHERE id = '" & k & "' ")
registro.Position = k
Label1.Text = "id " & registro.getString("id")
EditText1.Text = registro.GetString("nombre")
EditText2.Text = registro.GetString("apellido")
EditText3.Text = registro.GetString("edad")
End Sub
Sub Button5_Click
' Adelante
k = k + 1
If k > registro.RowCount - 1 Then k = registro.RowCount - 1
' registro = SQL1.ExecQuery("SELECT * FROM empleados WHERE id = '" & k & "' ")
registro.Position = k
Label1.Text = "id " & registro.getString("id")
EditText1.Text = registro.GetString("nombre")
EditText2.Text = registro.GetString("apellido")
EditText3.Text = registro.GetString("edad")
End Sub
Sub Button6_Click
' Reconstruye las id
Dim tomaid, t As Int
registro = SQL1.ExecQuery("SELECT id FROM empleados")
For n = 0 To registro.RowCount - 1
t = n + 1
registro.Position = n
tomaid=registro.getString("id")
SQL1.ExecNonQuery("UPDATE empleados set id ='"& t &"' WHERE id = '" & tomaid & "' ")
Next
Carga_BD_en_ListView
' SQL1.ExecNonQuery("REINDEX empleados") ' No funciona así
End Sub
Sub ListView1_ItemClick (Position As Int, Value As Object)
' Pulsa sobre un Registro
Dim pulsado As String
Dim lugar As Int
pulsado = Value
lugar = pulsado.IndexOf("|")
pulsado = pulsado.SubString2(0, lugar)
id = pulsado
registro = SQL1.ExecQuery("SELECT * FROM empleados where id = '" & id & "' ")
registro.Position = 0
Label1.Text = "id " & registro.getString("id")
EditText1.text=registro.getString("nombre")
EditText2.text=registro.getString("apellido")
EditText3.text=registro.getString("edad")
End Sub
Sub Relleno (frase As String, longitud As Int ) As String
Dim lleno As String
For n = 0 To longitud
lleno = lleno & " "
Next
' Espacios a derecha
frase = frase & lleno
frase = frase.substring2(0, longitud)
' Espacios a izquierda
'frase = lleno & frase
'frase = frase.SubString2(frase.Length - longitud, frase.Length)
Return frase
End Sub |
___________________________________________________________
2.- Otro código, en este caso no existe ListView, los Botones (Button4 y Button5) son los que eligen el registro.
La base de datos en esta aplicación es: basedatos.zip la debes copiar en la carpeta Files.
Ahora mediante el Designer creamos un Layout, lo llamaremos "Layout" y contendrá:
Label1 ...... Nombre
Label2....... Tel.:
EditText1
EditText2
Button1..... Añadir
Button2 .... Borrar
Button3 .... Editar
Button4... <<
Button5... >> |
|
Copia y pega este código en un nuevo proyecto |
Sub Process_Globals
' Juan Antonio Villalpando
' juana1991@yahoo.com
' febrero 2013
End Sub
Sub Globals
Dim SQL1 As SQL
Dim registro As Cursor
Dim EditText1, EditText2 As EditText
Dim nombre, telefono, nombre_actual As String
Dim Id As String
Dim k As Int
k = 0
End Sub
Sub Activity_Create(FirstTime As Boolean)
Activity.LoadLayout("Layout")
If File.Exists(File.DirInternal,"basedatos.sql") = False Then
' Ponemos una base inicial de datos en la carpeta Files.
' Luego la copiamos a la SD Card
File.Copy(File.DirAssets,"basedatos.sql",File.DirInternal,"basedatos.sql")
End If
If SQL1.IsInitialized = False Then
SQL1.Initialize(File.DirInternal, "basedatos.sql", False)
End If
' Carga en registro toda la tabla usuarios
registro = SQL1.ExecQuery("SELECT * FROM usuarios")
End Sub
Sub Activity_Resume
End Sub
Sub Activity_Pause (UserClosed As Boolean)
End Sub
Sub Button1_Click
' Añadir Registro
nombre = EditText1.Text
telefono = EditText2.Text
If nombre = "" OR telefono = "" Then
Msgbox("Debes escribir el nombre y el teléfono.","Faltan datos.")
Else
' Busca el último Registro
otraId = SQL1.ExecQuerySingleResult("SELECT Max(id) FROM empleados")
' Crea un nuevo Registro
otraId = otraId + 1
SQL1.ExecNonQuery("INSERT INTO usuarios VALUES('" & otraId & "','" & nombre & "','" & telefono & "')")
' Carga en registro toda la tabla usuarios
registro = SQL1.ExecQuery("SELECT * FROM usuarios")
EditText1.Text = ""
EditText2.Text = ""
EditText1.RequestFocus
End If
End Sub
Sub Button2_Click
' Borrar Registro
nombre = EditText1.Text
telefono = EditText2.Text
If nombre = "" OR telefono = "" Then
Msgbox("No hay nombre de usuario.","Faltan datos.")
Else
SQL1.ExecNonQuery("DELETE FROM usuarios where nombre = '" & nombre & "' ")
' Carga en registro toda la tabla usuarios
registro = SQL1.ExecQuery("SELECT * FROM usuarios")
EditText1.Text = ""
EditText2.Text = ""
End If
End Sub
Sub Button3_Click
' Editar Registro
nombre = EditText1.Text
telefono = EditText2.Text
If nombre = "" OR telefono = "" Then
Msgbox("Debes rellenar los dos campos con datos.","Campos vacíos.")
Else
SQL1.ExecNonQuery("UPDATE usuarios set nombre ='"& nombre &"',telefono ='"& telefono &"' WHERE nombre = '" & nombre_actual & "'")
' Carga en registro toda la tabla usuarios
registro = SQL1.ExecQuery("SELECT * FROM usuarios")
End If
End Sub
Sub Button4_Click
' Atrás
k = k - 1
If k < 0 Then k = 0
' registro = SQL1.ExecQuery("SELECT * FROM usuarios where Id = '" & k & "' ")
registro.Position = k
EditText1.Text = registro.GetString("nombre")
EditText2.Text = registro.GetString("telefono")
nombre_actual = EditText1.Text
End Sub
Sub Button5_Click
' Adelante
k = k + 1
If k > registro.RowCount - 1 Then k = registro.RowCount - 1
' registro = SQL1.ExecQuery("SELECT * FROM usuarios where Id = '" & k & "' ")
registro.Position = k
EditText1.Text = registro.GetString("nombre")
EditText2.Text = registro.GetString("telefono")
nombre_actual = EditText1.Text
End Sub
|
________________________________________________
3.- Imágenes en una base de datos SQLite.
En este caso se ha creado una base de datos que contiene imágenes, esta base de datos está en el directorio Files y es de SQLite.
Baja el código Blob1.zip de esta página. También aquí: Blob.zip
________________________________________________
4.- SQLite en un List y en un Spinner.
Ahora mediante el Designer creamos un Layout, lo llamaremos "Layout" y contendrá:
un Spinner1 y un Label1.
En la carpeta Files del proyecto copiamos la misma basedatos.sql de los ejemplos anteriores.
basedatos.zip
Con el Spinner podemos elegir el nombre de un usuario y saldrá su teléfono en el Label1.
|
|
Copia y pega este código en un nuevo proyecto |
Sub Process_Globals
' Juan Antonio Villalpando
' juana1991@yahoo.com
' junio 2013
End Sub
Sub Globals
Dim SQL1 As SQL
Dim registro As Cursor
Dim Spinner1 As Spinner
Dim Label1 As Label
Dim List1 As List
End Sub
Sub Activity_Create(FirstTime As Boolean)
Activity.LoadLayout("Layout")
If File.Exists(File.DirInternal,"basedatos.sql") = False Then
' Ponemos una base inicial de datos en la carpeta Files.
' Luego la copiamos a la SD Card
File.Copy(File.DirAssets,"basedatos.sql",File.DirInternal,"basedatos.sql")
End If
If SQL1.IsInitialized = False Then
SQL1.Initialize(File.DirInternal, "basedatos.sql", False)
End If
' Llama a la Subrutina para cargar la base de datos en el List1
List1.Initialize
Carga_BD_en_List
End Sub
Sub Activity_Resume
End Sub
Sub Activity_Pause (UserClosed As Boolean)
End Sub
Sub Carga_BD_en_List
' Limpia el List1
List1.Clear
' Carga la tabla usuarios de la basedatos.sql
registro = SQL1.ExecQuery("SELECT * FROM usuarios")
For n = 0 To registro.RowCount - 1
registro.Position = n
List1.Add(registro.GetString("telefono"))
Spinner1.Add(registro.GetString("nombre"))
Next
End Sub
Sub Spinner1_ItemClick (Position As Int , Value As Object )
Label1.Text = "Teléfono = " & List1.Get(Position)
End Sub |
________________________________________________
5.- Pasar los datos de una SQLite a un archivo de Excel de tipo CSV.
Esto consiste en que tenemos una base de datos SQLite, en nuestro ejemplo será la "basedatos.sql" y queremos pasarla a un archivo de tipo CSV, concretamente a "basedatos.csv",ya que este tipo de archivos los puede leer el Excel.
En los archivos de tipo CSV el separador de campos es el ";"
Para ello en el ejemplo anterior 4.- SQLite en un List y en un Spinner, agregamos un Button1, le ponemos de texto "Pasar a CSV" y agregamos esté código al anterior...
Copia y pega este código al final del proyecto 4.- |
Sub Button1_Click()
Dim List2 As List
' Inicia el List2
List2.Initialize
' Carga la tabla usuarios de la basedatos.sql
registro = SQL1.ExecQuery("SELECT * FROM usuarios")
For n = 0 To registro.RowCount - 1
registro.Position = n
List2.Add(registro.GetString("Id") & ";" & registro.GetString("telefono") & ";" & registro.GetString("nombre"))
Next
File.WriteList(File.DirRootExternal, "basedatos.csv", List2)
End Sub
|
Creamos un List2 y en él vamos agregando cada registro. Separamos los campos mediante ";"
Cuando ya ha recorrido todos los registros, guarda el List2 en el archivo "basedatos.csv" de la SdCard (DirRootExternal).
Para ver directamente el archivo obtenido basedatos.csv desde el terminal, tendríamos que conocer el tutorial de Linux en Android.
Abrimos un Terminal mediante el comando "cmd". Nos posicionamos en la carpeta donde esté el adb, probablemente...
C:\Android\android-sdk\platform-tools
cd C:\Android\android-sdk\platform-tools
C:\Android\android-sdk\platform-tools> adb shell
# cd /mnt/sdcard
# ls
basedatos.csv
# cat basedatos.csv
|
Para pasar el archivo basedatos.csv desde la SdCard a un archivo de Windows, abrimos otro terminal mediante el "cmd".
cd C:\Android\android-sdk\platform-tools
C:\Android\android-sdk\platform-tools> adb -e pull "/mnt/sdcard/basedatos.csv" "C:/Android/basedatos.csv"
|
________________________________________________
6.- Otro ejemplo de SQLite en los foros.
Hay un interesante ejemplo de SQLite sencillo en este foro.
Concretamente el ejemplo SQLiteLight1.zip
_______________________________________________
7- Interesante aplicación de SQLite.
Nota: en los tutoriales de B4A puedes bajar una aplicación (SQLiteViewer) que carga base de datos SQLite.
Presionamos el botón Menú del móvil y nos saldrá un explorador para elegir la base de datos con la que queremos trabajar.
Si no tienes ninguna, puedes crearte una con el programa que he puesto más arriba.
La base de datos la podemos poner en el tarjeta SDCard (Menu Internal Files Manager) es el Directorio: DirRootExternal
Ver tutorial.
________________________________
|