Italian Boolean SQLLite

Ennesima77

Member
Licensed User
Longtime User
Ciao a tutti,
ho notato che il valore Boolean in db SQLite è memorizzato come spesso accade come 1 o 0. Quando però viene richiamato e usato ad esempio per checcare un checkbox viene generato un errore.
Per ovviare alla questione io ho usato un If
B4X:
If RecordData.Get("booking")="1" Then
   chkBooking.Checked=True
Else
   chkBooking.Checked=False
End If
Per richiamare i dati io uso un MAP riempito con ExecuteMap
B4X:
Dim RecordData As Map
RecordData.Initialize
RecordData=DBUtils.ExecuteMap(Main.SQLDB,"Select * from customer where ID = " & ID, Null, False,"")
ma possibile che non si possa fare direttamente in un unica riga?
 
Last edited:

Ennesima77

Member
Licensed User
Longtime User
e se provi con una riga sola cosi ?
If RecordData.Get("booking")="1" Then chkBooking.Checked=True else hkBooking.Checked=False

Non ho verificato ma prova
ciaoo
mamo

si forse funziona uguale, però è un codice "sporco" e complesso da leggere.
 

arenaluigi

Well-Known Member
Licensed User
Longtime User
Allora, io creerei una classe VariableConverter, dove scriverei tutti i metodi che ritornano un dato castato.
Esempio:

B4X:
Public sub IntToBoolean (value as int)as boolean
 if value=0 then
   return false
 else
  return true
 end if

End sub

Qui, la chiamata:
B4X:
chkBooking.Checked==classe.IntToBoolean(1)
Questo è solo un esempio, poi puoi usarla nei tuoi progetti, ho addirittura scrivere una lib per tutti gli utenti di b4A

Ciao
 

Ennesima77

Member
Licensed User
Longtime User
Allora, io creerei una classe VariableConverter, dove scriverei tutti i metodi che ritornano un dato castato.
Esempio:

B4X:
Public sub IntToBoolean (value as int)as boolean
 if value=0 then
   return false
 else
  return true
 end if

End sub

Qui, la chiamata:
B4X:
chkBooking.Checked==classe.IntToBoolean(1)
Questo è solo un esempio, poi puoi usarla nei tuoi progetti, ho addirittura scrivere una lib per tutti gli utenti di b4A

Ciao

Buona idea, ed è la seconda della giornata che mi dai! La metto in una classe apposita, stavo già creando una classe per i controlli del null ed altre cose che potevano servirmi.

La libreria non saprei come farla, vengo dal mondo VB.Net e la programmazione Java la conosco davvero poco (piccole reminiscenze del corso di informatica all'università)
 

dexMilano

Active Member
Licensed User
Longtime User
Mi riattacco qui perchè mi sono imbattuto anche io nel punto

Questo sarebbe troppo facile?
chkBooking.Checked = (RecordData.Get("booking")="1")
(non funziona!)

Ma come si memorizzano i bool?
Ho visto che SQLbrowser me lo fa fare ma non vedo un metodo "getbool" come ho getInt, getLong, getString...
 

arenaluigi

Well-Known Member
Licensed User
Longtime User
I bool sia in mysql che in sqlite sono degli integer, perciò quando crei una tabella, e aggiungi un campo che dovrebbe essere booleano, lo dichiari come integer, 0=false 1=true.
Poi puoi seguire il consiglio nel post sopra.
Perciò:

'funzione che converte da integer a boolean
B4X:
Public sub IntToBoolean (value as int)as boolean
if value=0 then
  return false
else
  return true
end if

End sub

dim xyz as int=RecordData.Get("booking")
chkBooking.Checked =IntToBoolean(xyz)
 

LucaMs

Expert
Licensed User
Longtime User
Mi riattacco qui perchè mi sono imbattuto anche io nel punto

Questo sarebbe troppo facile?
chkBooking.Checked = (RecordData.Get("booking")="1")
(non funziona!)

Ma come si memorizzano i bool?
Ho visto che SQLbrowser me lo fa fare ma non vedo un metodo "getbool" come ho getInt, getLong, getString...



chkBooking.Checked = (RecordData.Get("booking")="1")

Questa sopra non funziona? Se, come immagino, hai definito "booking" come Integer,
chkBooking.Checked = (RecordData.Get("booking") = 1)
dovrebbe funzionare benissimo (se uso il condizionale, è chiaro che non ho provato :))


P.S. come non detto!
Adesso ho provato e, stranamente, mi funziona benissimo ma con le virgolette!
Dovrò rileggere come sono le Map, a questo punto, ma mi sembra di ricordare che
sia le chiavi che i valori possano essere di vario tipo... qui sembra che i valori debbano
essere di tipo stringa.

Non è esatto: The key should be a string or a number. The value can be any type of object.

Cmq, vi assicuro che la riga seguente mi funziona perfettamente:

CheckBox1.Checked = (RecordData.Get("inofferta") = "1")
 
Last edited:

LucaMs

Expert
Licensed User
Longtime User
Scusami,
ma RecordData di che tipo è ? è una Map ?

Si...

' Come vedi nel codice, dichiaro il campo "inofferta" come INTEGER e poi non ho quel problema.
B4X:
FieldsMap.Put(FN_SCONTRINODT_INOFFERTA, DBUtils.DB_INTEGER)
DBUtils.CreateTable(DB, TB_SCONTRINODT, FieldsMap, FN_SCONTRINODT_ID)

Poi, per prova, ho aggiunto:
B4X:
Dim Query As String
Query = "SELECT * FROM " '...
RecordData = DBUtils.ExecuteMap(modDBHelper.DB, Query, Null)

La cosa strana è che funziona se uso le virgolette!

Ho però notato che Ennesima77 utilizza:
B4X:
RecordData=DBUtils.ExecuteMap(Main.SQLDB,"Select * from customer where ID = " & ID, Null, False,"")

La sua ExecuteMap richiede un maggior numero di parametri. Evidentemente, usiamo due versioni di DBUtils differenti (non sono certo del numero di versione del mio, l'ho modificato, ma dovrebbe essere Version 1.08 - Modified: 15.06.2011 Markus Stipp)

P.S.
FN_SCONTRINODT_INOFFERTA etc. sono "costanti" coi nomi di tabelle e campi
 

dexMilano

Active Member
Licensed User
Longtime User
Ciao a tutti,
io con SQLbrowser avevo definito il campo sul DB come BOOL ma non mi funzionava (non sapevo come leggere o scriverla) e quindi alla fine ho fatto il campo come integer 0 False e 1 True.
Ho quindi reimpostatpo il tutto il codice

Per altro ho trovato un post con un brillante trucco per la conversione.
Adesso non la ritrovo ma quando ho un attimo la posto.

dex
 

LucaMs

Expert
Licensed User
Longtime User
Ciao a tutti,
io con SQLbrowser avevo definito il campo sul DB come BOOL ma non mi funzionava (non sapevo come leggere o scriverla) e quindi alla fine ho fatto il campo come integer 0 False e 1 True.
Ho quindi reimpostatpo il tutto il codice

Per altro ho trovato un post con un brillante trucco per la conversione.
Adesso non la ritrovo ma quando ho un attimo la posto.

dex

Non mi risulta che esistano i campi BOOL in SQLite, a meno che io non stia usando una versione vecchia (3).
Non vorrei che tu lo avessi definito BLOB.

Cmq, ripeto che a me non dà problemi, col codice del mio post precente
 
Top