Technical Support
🟢 Online now
Hello 👋

How can we help you today?
Contact on WhatsApp
B4X Store
jdashboardUI / Tables & Data / JDataset
Tables & Data

JDataset

Data Binding entre Views y SQLite, navegación de registros y CRUD

Buscar en toda jdashboardUI
Fuente
jdashboardUI.b4xlib · Solo API pública
Idioma de la tienda: es

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 AddGroupView usando el Tag como 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 Query y Query2.
  • Soporte de TextField, JEditText, Label, ComboBox, CheckBox, jCheckbox, ImageView y JImageView.
  • Imágenes y archivos almacenados como BLOB.
  • Exportación de registros a Map y List.
  • 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

  • TextField
  • JEditText
  • Label
  • ComboBox
  • CheckBox
  • jCheckbox
  • ImageView
  • JImageView

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:

  1. ejecuta la consulta;
  2. guarda la lista de IDs;
  3. posiciona el dataset en el primer registro;
  4. 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")

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

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:

  • ImageToBytes
  • BytesToBitmap
  • ImageToBase64
  • Base64ToImage
  • IcoToBitmap

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:

  • ExportRecordToMap
  • ExportAllRecordsToList
  • ExportQueryToList
  • ExportAllFilesFromColumn
  • ExportAllFilesFromColumn2

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.