Italian rubrica telefonica

arenaluigi

Well-Known Member
Licensed User
Longtime User

fireblade

Member
Il progettino della rubrica l'ho finito seguendo le tue dritte

Popolo la listview, e cliccandoci sopra invio i dati alle text, ho aggiunto un piulsante per inserire un nuovo contatto,per eliminare un contatto, per cercare un contatto, per modificare un contatto, fin qua funziona tutto, pero solo con l'emulatore 4.1, con quelli inferiori mi carica la listview, ma non passa i dati alle text...e inoltre anche con il 4.1 non mi funziona la tastiera del pc, c'è da fare qualche impostazione particolare?
Dimenticavo, con un'altro button ho anche elimimato la tabella e aggiunto una nuova con i relativi campi.

Tornando alla rubrica, ho però dei problemi:
1) Ho aggiunto due button per andare avanti e indietro con i record per popolare le text, ma non riesco proprio.(ho letto tante guide ed esempi)

2) Quando salvo il numero di telefono, mi mangia lo zero iniziale, mentre se lo zero lo metto dal secondo numero in poi non lo perdo.

Se faccio l' apk con l'emulatore 4.1, quest'ultimo si può installare su telefoni che hanno versioni inferiori?
 

arenaluigi

Well-Known Member
Licensed User
Longtime User
Tornando alla rubrica, ho però dei problemi:
1) Ho aggiunto due button per andare avanti e indietro con i record per popolare le text, ma non riesco proprio.(ho letto tante guide ed esempi)
Devi giocare con l'istruzione cursor.position(x) dove x e la posizione del record.
Ricordati di gestire il numero massimo di record altrimenti ti da errore.
Se non ricordo male il primo record equivale alla posizione 0

2) Quando salvo il numero di telefono, mi mangia lo zero iniziale, mentre se lo zero lo metto dal secondo numero in poi non lo perdo.
Questa domanda me la aspettavo :D tu hai dichiarato il numero telefonico come integer, ma così facendo ti sega via gli zeri davanti, immagina se poi hai un numero telefonico con +39 ti va in errore, devi dichiararlo come string.

Se faccio l' apk con l'emulatore 4.1, quest'ultimo si può installare su telefoni che hanno versioni inferiori?
No perchè la versione 4.1 potrebbe avere funzionalità che la 2.3 o la 2.2 non hanno.
:sign0098:
 

fireblade

Member
Quando creo il db con SQLite database browser posso impostare i campi solo nel seguente modo:
text; numeric; blob; primary key,
quindi per impostare il campo "telefono" come string basta farlo da codice al di là di quello che imposto del db? (cursor1.Getstring("telefono").

Hai qualche idea di come potrei risolvere il problema dell'emulatore in versione
inferiore alla 4.1?
 

arenaluigi

Well-Known Member
Licensed User
Longtime User
Nel db devi impostarlo come text, nel codice come string.

Per quanto riguarda la gestione delle versioni, gli elementi più importanti da tenere in considerazione sono i seguenti:

targetSdkVersion
android:maxSdkVersion
android:minSdkVersion


Trovi una spiegazione in inglese al seguente link:
<uses-sdk> | Android Developers

Comunque se cerchi con google ne trovi una marea anche in italiano.
 

fireblade

Member
Nel file allegato c'è il progetto, per cortesia mi fai la prova di mandarlo in esecuzione con l'emulatore 2.2 API 8, e controllare se cliccando sulla lisview i
dati passano alle text?(A me non succede niente)
Di conseguenza non mi funziona nemmeno il button "elimina".

Ho installato Android SDK anche su un S.O. pulito (seven) e fatto l'aggiornamento delle varie piattaforme, e il discorso non cambia, la listview mi funziona solo con la 4.1.
 

klaus

Expert
Licensed User
Longtime User
It's impossible to help you because the database is missing in your zip file so no possibility to test it.
Just a few points:
- in Sub btnnuovo_Click you could put Dim NewID As Int out of the For / Next loop.
- Sub carica and Sub btnleggi_Click are exactly the same routines so could remove carica and call btnleggi_Click instead.
- you should add cursor1.Close at the end of the of the queries after the For / Next loops
- you should move lvdb.SingleLineLayout.label.TextColor = Colors.Black out of the For / Next loop.
- to get the max ID value you could use NewID = SQL1.ExecQuerySingleResult("SELECT max(id) FROM tabella") + 1
- a more intersting way to manage the ID's would have been to use INTEGER PRIMARY KEY as the variaable type and use a NULL value for it when inserting a new record.

You could have a look at chapter 3 in the User's Guide.

Best regards.
 
Last edited:

fireblade

Member
I downloaded the file now, the database is located in the files.
I understand that Sub btnleggi_Click this is not

this Sub btnnuovo_Click you could put Dim NewID As Int out of the For / Next loop, now it's ok
this cursor1.Close now it's ok
 
Last edited:

klaus

Expert
Licensed User
Longtime User
Attached you find a modified version that works.
You didn't see anything in the ListView because the database is empty.
Add a new record and you will see it.
The database in the zip file is the one from your zip file.
I will be absent since tomorrow till next wednesday.

Best regards.
 

Attachments

  • Rubrica sql_1.zip
    8.2 KB · Views: 265

fireblade

Member
Ora mi funziona anche l'emulatore 2.2 API 8.
Prima non funzionava perchè avevo sbagliato una variabile:

Dim idtx As string (modo errato)

Dim idtx As Int (modo ok)

Dim idvalue As String
idvalue = Value
countIt = idvalue.IndexOf(":") 'find location of sperator
idvalue = idvalue.SubString2(0,countIt) 'find first part of label text
idtx = idvalue


però nonostante ciò con l'emulatore 4.1 funziona benissimo.

Sono 2 notti che non dormo per fare una semplice rubrica....
se dovevo fare un programma serio mi ci voleva almeno un anno.

Però c'è sempre il problema dei pulsanti avanti e indietro dei record e passare i dati alle text.
Chi se la sente di scivermi questo codice?






Now I also work the emulator API 2.2 8.
Before it did not work because I had missed a variable:

Dim idtx As string (ko)

Dim idtx As Int (ok)

Dim idvalue As String
idvalue = Value
countIt = idvalue.IndexOf(":") 'find location of sperator
idvalue = idvalue.SubString2(0,countIt) 'find first part of label text
idtx = idvalue

But despite that 4.1 works fine with the emulator.

They have not slept for 2 nights to make a simple book ....
If I had to do a serious program I needed at least a year.

But there is always the problem of backward and forward buttons of the records and pass data to the text.
Who feels scivermi of this code?

Your code is professional, btnnuovo_Click is excellent
it works great
I at least have found the error of the variable ...
when you have time I write the code for the buttons back and next?
 

arenaluigi

Well-Known Member
Licensed User
Longtime User
Ciao,
ho modificato il progetto aggiungendo avanti/indietro, sarebbe da gestire diversamente, ma la logica è corretta.

Volevo farti due osservazioni:

1)Tutte le volte che fail il cerca, il click sulla list view effettui un filtro, ogni volta devi rileggere il contenuto del database altrimenti avrai solo ed un unico record.
Secondo me devi agire su due cursori, uno per i vari filtri ed uno per la lettura completa della tabella.

2)Ho notato che fai sempre un ciclo for/next , ma se il risultato di un filtro ha più record, ti prendi sempre l'ultimo record.Perciò il ciclo for next non ti serve in questo caso, devi prendere il primo record, a meno che non vuoi visualizzarli in una grid o altro multi record.

Ciao

Ciao
 

fireblade

Member
grazie di cuore Luigi per il tempo che mi dedichi e per i consigli...

ti va di mettermi a posto anche il punto 1 e 2?

Anche perchè se vedo l'esempio scritto con il codice capisco molto meglio, infatti ho visto il codice per pulsanti avanti e indietro ed è tutto più chiaro...

io con il tasto cerca stò perdendo tempo per fare una ricerca con il like, se ho ben capito così posso usare il carattere jolly (%)
esempio:
se devo cercare la parola "nome" nel db, nella text di cerca potrei scrivere
%no% e mi cerca tutte le parole che contengono le lettere "no"?Giusto?
 

arenaluigi

Well-Known Member
Licensed User
Longtime User
Attualmente il punto 1 è già a posto tu hai due cursori, uno per i filtri e e levarie azioni sui record.
L'altro è quello che ti gestisce l'avanti ed indietro.

Per il secondo punto non fai altro che eliminare il ciclo for/next e scrivere.

if cursor1.RowCount > 0 then
cursor1.Position = 0
txtnome.text=cursor1.getString("nome")
txtcognome.text=cursor1.getString("cognome")
txtntel.text=cursor1.getstring("telefono")
end if

Attenzione non è un errore quel codice con il for/next è solo rindondante.
 

fireblade

Member
per il punto 2 faccio così:
lvdb.Clear'need to clear the list
cursor1 = SQL1.ExecQuery("SELECT * FROM tabella WHERE nome='" & txtcerca.Text & "'")
For i = 0 To cursor1.RowCount - 1
cursor1.Position = i
lvdb.AddSingleLine(cursor1.GetString("id")& " : " & cursor1.GetString("nome")& " " & cursor1.Getstring("cognome")& " " & cursor1.Getstring("telefono"))
Next
cursor1.Close

altro problema
con questa istruzione mi cerca tutte le parole comprese tra "%"
cursor1 = SQL1.ExecQuery("SELECT * FROM tabella where nome like '%parola%' ")

ma se voglio cercare con il carattere % una parola scritta nella txtcerca.text ho fatto così, ma non funziona

cerca= txtcerca.Text
cursor1 = SQL1.ExecQuery("SELECT * FROM tabella where nome like '% & cerca & % ' ")

oppure

cerca= txtcerca.Text
cursor1 = SQL1.ExecQuery("SELECT * FROM tabella where nome like '%cerca%' ")
 
Last edited:

fireblade

Member
sembra che ho risolto...
cursor1 = SQL1.ExecQuery("Select * FROM tabella where nome like '%" & txtcerca.Text & "%'")

però in questo modo anche se non viene digitato nulla nella txtcerca, comunque trova qualsiasi parola, per evitare questo ho fatto:

If txtcerca.Text.Trim.Length > 0 Then
cursor1 = SQL1.ExecQuery("Select * FROM tabella where nome like '%" & txtcerca.Text & "%'")

credo però che sicuramente c'è n modo più pulito per ottenere lo stesso risultato...
 

fireblade

Member
se provo a salvare una parola che contiene lettere accentate, mi si pianta tutto.
Il problema risiede nel DB, oppure bisogna intervenire a livello di codice?
Il campo nome e cognome sono impostati inText

Con sqlite database browser posso impostare il campo in Text,Numeric,Blob e naturalmente Primary Key.
 

fireblade

Member
ho inserito nome e cognome con lettere accentate direttamente nel DB, risultato:
Apro l'emulatore e mi trovo la listview caricata esattamente come ho scritto io le parole accentate, ma se clicco sulla listview per passare i dati alle text mi ritrovo le parole scritte correttamente ma senza accento:
Esempio:
Nella listview c'è scritto "però" ma nella text leggo "pero", quindi il problema risiede nella text, perchè proprio li scrivo il testo per salvarlo la prima volta.
 

fireblade

Member
ho sbagliato a dire che non accetta i caratteri accentati, in realtà non accetta il carattere "apice", ho provato con tutti i caratteri (? " ! " % & (; : ò à è ì ) e non ci sono problemi.
Nell' evento Enterpressed, TextChanged e FocusChanged della editext ho scritto questo codice di prova:
Dim keycode As String (e anche Dim keycode As int)
If keycode = KeyCodes.KEYCODE_1 Then
Msgbox("Ciao","Titolo")
End If

ma alla pressione del tasto 1 non succede niente, io vorrei in qualche modo disabilitare la pressione del tasto apostrofo, oppure inserire un'altro carattere al suo posto.
In che modo posso gestire la pressione del tasto apice dentro una edittext?
 
Last edited:
Top