Tables & Data · jdashboardUI · B4J / SQLite
JDataset es un componente de acceso y vinculación de datos. Su función principal no es mostrar una tabla: permite vincular Views de la interfaz con campos de una base de datos SQLite, cargar el registro actual en esos controles y guardar los cambios de vuelta en la base.
Características destacadas
- Data Binding entre campos SQLite y Views.
- Vinculación individual con
AddLinkView. - Vinculación automática de un grupo de controles con
AddGroupViewusando elTagcomo nombre de campo. - Navegación entre registros: primero, anterior, siguiente, último y posición directa.
- CRUD: insertar, actualizar y eliminar usando los valores actuales de los controles vinculados.
- Consultas normales y parametrizadas con
QueryyQuery2. - Soporte de
TextField,JEditText,Label,ComboBox,CheckBox,jCheckbox,ImageViewyJImageView. - Imágenes y archivos almacenados como BLOB.
- Exportación de registros a
MapyList. - Creación de tablas SQLite.
- Copia de la base de datos.
Concepto: vincular Views a campos
La idea central de JDataset es esta:
Data.AddLinkView(txtName, "name")
Data.AddLinkView(txtPrice, "price")
Data.AddLinkView(chkActive, "active")
Cada View queda asociada a un campo. Cuando JDataset carga un registro, actualiza automáticamente esos controles. Cuando llamas UpdateChange o AddRecord, JDataset lee los valores actuales de esos mismos controles.
Esto convierte un formulario B4J en un editor de registros con muy poco código.
Initialize
Private Data As JDataset
Data.Initialize(File.DirApp, "shop.db", True)
Firma pública:
Initialize(Path As String, FileName As String, CreateIfNecessary As Boolean)
JDataset es una clase de lógica/datos. No tiene Designer Properties ni DesignerCreateView.
AddLinkView
Vincula una View concreta a un campo:
Data.AddLinkView(txtName, "name")
Data.AddLinkView(txtPrice, "price")
Data.AddLinkView(cmbCategory, "category")
Data.AddLinkView(chkActive, "active")
Data.AddLinkView(imgPhoto, "photo")
Cuando cambia el registro actual, JDataset carga el valor del campo en la View.
Views soportadas por la implementación
TextFieldJEditTextLabelComboBoxCheckBoxjCheckboxImageViewJImageView
Las imágenes se leen y escriben como BLOB.
AddGroupView
También puedes vincular muchos controles de una sola vez usando su propiedad Tag.
Ejemplo conceptual en el Designer:
txtName.Tag = name
txtPrice.Tag = price
cmbCategory.Tag = category
chkActive.Tag = active
imgPhoto.Tag = photo
Después:
Dim Result As String = Data.AddGroupView(pnlEditor)
Log(Result)
JDataset recorre las Views del panel y usa cada Tag no vacío como nombre de campo.
Consulta y carga automática
Data.Query("SELECT * FROM products ORDER BY id", "id")
El segundo parámetro es el nombre de la clave primaria.
JDataset:
- ejecuta la consulta;
- guarda la lista de IDs;
- posiciona el dataset en el primer registro;
- carga los campos en las Views vinculadas.
Consulta parametrizada
Dim Args() As String = Array As String("active")
Data.Query2( _
"SELECT * FROM products WHERE status = ?", _
Args, _
"id")
Navegación de registros
Data.FirstRecord
Data.PreviousRecord
Data.NextRecord
Data.LastRecord
También puedes usar la propiedad:
Data.Position = 3
Log(Data.Position)
Log(Data.Size)
Cada cambio de posición carga automáticamente el nuevo registro en las Views vinculadas.
Propiedades públicas:
| Propiedad | Acceso | Tipo |
|---|---|---|
| SQL | lectura | SQL |
| CurrentTable | lectura | String |
| Position | lectura / escritura | Int |
| Size | lectura | Int |
Ejemplo completo: formulario vinculado a SQLite
Sub Class_Globals
Private Root As B4XView
Private Data As JDataset
Private txtName As TextField
Private txtPrice As TextField
Private cmbCategory As ComboBox
Private chkActive As CheckBox
End Sub
Private Sub B4XPage_Created (Root1 As B4XView)
Root = Root1
Root.LoadLayout("ProductEditor")
Data.Initialize(File.DirApp, "shop.db", True)
Data.AddLinkView(txtName, "name")
Data.AddLinkView(txtPrice, "price")
Data.AddLinkView(cmbCategory, "category")
Data.AddLinkView(chkActive, "active")
Data.Query("SELECT * FROM products ORDER BY id", "id")
End Sub
Private Sub btnNext_Click
Data.NextRecord
End Sub
Private Sub btnPrevious_Click
Data.PreviousRecord
End Sub
Private Sub btnSave_Click
Data.UpdateChange
End Sub
Private Sub btnNew_Click
Data.AddRecord
End Sub
Private Sub btnDelete_Click
Data.DeleteRecord
End Sub
Al pulsar siguiente/anterior, los controles cambian de contenido porque JDataset carga el registro nuevo.
CRUD usando las Views
Insertar
Data.AddRecord
JDataset lee los controles vinculados y construye el INSERT.
Actualizar
Data.UpdateChange
Lee los valores actuales y actualiza el registro seleccionado. La clave primaria no se incluye en los campos actualizados.
Eliminar
Data.DeleteRecord
Elimina el registro actual y ajusta la posición del dataset.
Recargar
Data.RefreshField
Vuelve a cargar el registro actual en las Views.
Leer campos directamente
Estos métodos empiezan por get, pero reciben un parámetro y por eso son métodos, no propiedades B4X:
Dim Name As String = Data.getString("name")
Dim Quantity As Int = Data.getInt("quantity")
Dim Total As Long = Data.getLong("total")
Dim Price As Double = Data.getDouble("price")
Dim Photo() As Byte = Data.getBlob("photo")
Buscar registros
Search
Dim Found As Boolean = Data.Search("code", "A-100")
Busca por campo y valor dentro de la tabla activa.
Find
Data.Find("products", "id", "category", "Keyboard")
Cambia el conjunto de IDs a los registros encontrados y se posiciona en el primero.
BLOB, imágenes y archivos
JDataset puede almacenar archivos directamente en campos BLOB.
Guardar archivo
Data.StoreFile("manual", File.Combine(File.DirApp, "manual.pdf"))
Recuperar archivo
Dim Ok As Boolean = Data.RetrieveFile( _
"manual", _
File.Combine(File.DirApp, "manual-copy.pdf"))
Información
Log(Data.GetFileSize("manual"))
Log(Data.IsFileFieldValid("manual"))
Conversión de imágenes:
ImageToBytesBytesToBitmapImageToBase64Base64ToImageIcoToBitmap
La librería utiliza image4j-0.7 para soporte ICO.
Campos y esquema
Dim Fields As List = Data.GetTableFields
If Data.FieldExists("price") Then
Data.UpdateFieldValue("price", 19.95)
End If
Crear tabla
Dim Columns As Map
Columns.Initialize
Columns.Put("id", "INTEGER PRIMARY KEY")
Columns.Put("name", "TEXT")
Columns.Put("price", "REAL")
Columns.Put("active", "INTEGER")
Data.CreateTable("products", Columns)
Exportación
Métodos públicos:
ExportRecordToMapExportAllRecordsToListExportQueryToListExportAllFilesFromColumnExportAllFilesFromColumn2
Para datos binarios usa las APIs BLOB/archivo en lugar de depender de las exportaciones textuales.
Control de Views
Data.SetViewsEnabled(False)
If Data.IsViewLinked("price") Then
Log("price is linked")
End If
Data.ClearLinkView
Base de datos
Acceso a la conexión:
Dim DB As SQL = Data.SQL
Copia:
Dim Copied As Boolean = Data.CopyDatabase(File.DirApp, "shop-backup.db")
Cerrar:
Data.CloseDB
API pública
Inicialización y consulta
Initialize, Query, Query2.
Data Binding
AddLinkView, AddGroupView, ClearLinkView, SetViewsEnabled, IsViewLinked.
CRUD y navegación
AddRecord, DeleteRecord, UpdateChange, NextRecord, PreviousRecord, FirstRecord, LastRecord, RefreshField.
Lectura directa
getString, getInt, getLong, getDouble, getBlob, GetBitmap.
Búsqueda
Search, Find.
Imágenes y archivos
ImageToBytes, BytesToBitmap, ImageToBase64, Base64ToImage, StoreFile, RetrieveFile, GetFileSize, IsFileFieldValid, IcoToBitmap.
Esquema y exportación
GetTableFields, FieldExists, CreateTable, ExportRecordToMap, ExportAllRecordsToList, ExportQueryToList, ExportAllFilesFromColumn, ExportAllFilesFromColumn2, UpdateFieldValue.
Base de datos
CloseDB, CopyDatabase.
Consideraciones
JDataset obtiene el nombre de la tabla a partir de la consulta. Para su flujo CRUD es recomendable trabajar con consultas sencillas de una tabla.
Los nombres de tabla y campo deben venir de un esquema controlado por la aplicación.
Relacionados
- JTableview: tabla visual avanzada.
- TableViewUtils: helpers visuales para celdas.