Skip to content

Iniziare ad usare la iOSTable su Xojo per iOS

Passando dalla programmazione per desktop o web a quella per iOS una delle cose diverse da affrontare è la gestione delle tabelle.

In questo tutorial vediamo come la gestione in realtà molto più efficiente.

Partiamo da un progetto semplice: un database con una lista di cliente che vogliamo mostrare nella nostra applicazione iOS come una lista con le informazioni.

Iniziamo creando il progetto XojoIOS che chiameremo Clienti

A questo punto aggiungiamo una proprietà all’oggetto app che rappresenta il nostro database (questo è un esempio, la scelta migliore sarebbe creare un oggetto apposito come sottoclasse di iOSSQLiteDatabase e gestire da li le funzionalità, ma per lo scopo dell’esempio va bene così)

E la definiamo con il nome db di tipo iOSSQLiteDatabase

Ora aggiungiamo l’evento Open all’oggetto App

e scriviamo il codice per inizializzare il nostro database dei clienti con un certo numero di record

//Per il test creaiamo un database in memoria
//a parte l'inizializzazione è del tutto analogo ad un database su file
Dim db As New iOSSQLiteDatabase
Dim ok As Boolean=db.Connect
If ok Then
  //Creiamo la tabella dei clienti
  Try
    db.SQLExecute "CREATE TABLE clienti (id INTEGER PRIMARY KEY, nome TEXT, luogo TEXT)" 
  Catch e As iOSSQLiteException
    System.DebugLog "Create table: "+e.Reason
    ok=False
  End Try
End If
 
If ok Then
  //Creiamo qualche cliente
  Dim sql As Text="INSERT INTO clienti (nome, luogo) VALUES (?, ?)"
  Dim luoghi() As Text=Array("Roma", "Milano", "Napoli", "Torino")
 
  //inseriamo diversi clienti nella tabella 
  //(semplicemente un nome sequenziale e un luogo random)
  For i As Integer=1 To 100
    Try
      db.SQLExecute sql, "Ditta n."+i.toText, luoghi(Math.RandomInt(0, luoghi.Ubound))
    Catch e As iOSSQLiteException
      System.DebugLog "Insert data ("+i.toText+"):"+e.Reason
      ok=False
    End Try
  Next
End If
 
If ok Then
  //La tabella è stata correttamente creata e riempita
  me.db=db
End If

A questo punto nella View1 diamo un titolo (Clienti) e trasciniamo un oggetto iOSTable in modo da avere questa schermata

Per poter visualizzare i dati abbiamo bisogno di un DataSource da assegnare alla tabella. Questo permette di richiamare solo i dati necessari alla visualizzazione e non dover disegnare tutti i dati, essendo un oggetto separato possiamo gestirlo come preferiamo senza essere legati a celle o altre info come spesso capita di fare con la ListBox.

La nostra DataSource dovrà mostrare una serie di clienti, quindi creiamo prima la classe per gestire i dati del singolo cliente. Nel nostro caso è molto semplice una semplice classe clClienti con tre proprietà: id as integer, nome as text e luogo as text.

Possiamo crearla direttamente da un recordSet della nostra tabella Clienti del database per cui aggiungiamo un metodo Constructor per popolarla.

Nel constructor scriviamo:

Public Sub Constructor(rs as iOSSQLiteRecordSet)
  id=rs.Field("id").IntegerValue
  nome=rs.Field("nome").TextValue
  luogo=rs.Field("luogo").TextValue
End Sub

Il datasource, che chiameremo dsClienti, sarà invece una classe che implementa l’interfaccia iOSTableDataSource e avrà una proprietà clienti() as clClienti che rappresenta i dati che vogliamo mostrare.

Aggiungiamo anche un metodo Constructor per crearla automaticamente dalla nostra tabella dei clienti.

Nel Constructor scriviamo:

If app.db<>Nil Then
  Try
    Dim rs As iOSSQLiteRecordSet=app.db.SQLSelect("select * from clienti")
 
    While Not rs.EOF
      clienti.Append new clCliente(rs)
      rs.MoveNext
    Wend
  End Try
End If

Veniamo ai metodi dell’interfaccia. Prima di tutto una spiegazione, la tabella su iOS è pensata come una sequenza di sezioni, che possono avere un titolo, e all’interno di queste le righe contenenti i dati.

Nel nostro caso semplice, non abbiamo sezioni e non mostriamo il titolo delle sezioni.

Il metodo SectionCount serve a dire quante sezioni sono presenti nella tabella, nel nostro caso 1.

// Part of the iOSTableDataSource interface.
//Non utilizziamo il parametro table
#Pragma Unused table
 
Return 1

Il metodo SectionTitle serve a restituire il titolo di una sezione. Nel nostro caso non vogliamo titoli di sezione per cui possiamo anche ignorarlo o semplicemente mettere i #Pragma relativi a table e section.

Il metodo RowCount serve semplicemente a dire quante righe sono presenti nella sezione che viene passata come parametro. Nel nostro caso scriviamo:

// Part of the iOSTableDataSource interface.
//Non utilizziamo i parametri table e section
#Pragma Unused table
#Pragma Unused section
 
//Il numero di righe nella sezione è pari al massimo indice del vettore dei clienti +1
Return clienti.Ubound+1

Il metodo RowData serve a popolare una cella identificata da section e row. Questo metodo viene richiamato automaticamente quando la cella viene visualizzata. Per cui solo le celle visibili saranno popolate e man mano che si scorre la tabella gli oggetti vengono riutilizzati e noi dobbiamo solo popolarli con questo metodo. Nel nostro caso possiamo scrivere:

// Part of the iOSTableDataSource interface.
//Non utilizziamo il parametro table
#Pragma Unused section
 
//Creiamo la nostra cella semplice
Dim c As iOSTableCellData=table.CreateCell
 
//diamo come titolo il nome del cliente
c.Text=clienti(row).nome
 
//diamo come descrizione il luogo del cliente
c.DetailText=clienti(row).luogo
 
//Restituiamo la cella popolata
Return c

Aggiungiamo ora alla View1 una proprietà ds as dsClienti e nell’evento Open della View1 scriviamo:

ds=new dsClienti
Table1.DataSource=ds

A questo punto lanciamo la nostra app nel simulatore e possiamo vedere i nostri dati e come è veloce nello scorrimento.

Un commento

  1. Grazie al tuo articolo, ora mi è chiaro come gestire un datasource con iOSTable.

I commenti sono chiusi.