Italian rubrica telefonica

fireblade

Member
Guardando video e leggendo testi in rete, (e anche scaricando del codice sorgente) ho fatto qualche piccola applicazione, di quelle banali per principianti.

Siccome vorrei realizzare un' applicazione che usi un DataBase,(vorrei fare una semplice rubrica che salva dei contatti) ho scaricato e creato un file.db con il software Sqlite Database Browser.

Gentilmente vorrei sapere il codice che devo inserire per leggere e salvare il .db, e quest'ultimo dove lo devo copiare?(Nella cartella files del progetto?)

A me per ora basta visualizzare i dati salvati in 2/3 caselle di testo e dei pulsanti per inserire, eliminare i record e per andare avanti e indietro.

P.S. ho anche scaricato del codice sorgente inerente a sql, però gli esempi che ho scaricato per me sono troppo difficili da capire.

Grazie per l'aiuto.
 

giannimaione

Well-Known Member
Licensed User
Longtime User
Ciao , se gli esempi che hai scaricato sono troppo complessi, che senso ha che qualcuno ti giri del codice già fatto ?
Leggiti i tutorial presenti con basic4.
Il mio ovviamente è un consiglio.

giusto!!!

prima regola
impara il SQL (Structured Query Language).... ti servirà sempre!
 

fireblade

Member
sono d'accordo con voi ragazzi,ma le prime applicazioni le ho fatto proprio leggendo il codice e sono riuscito anche a modificarlo e aggiungere qualcosa...e ho capito come funziona.
Io vorrei imparare sql ma fin quando imparo credo che android non si usa più, ecco perchè chiedevo questo tipo di aiuto almeno per iniziare, a me basterebbe poche righe di codice di voi esperti per capire tante cose, per leggere il file .db e come dicevo nel post precedente salvare ed eliminare i record,anche per fare un confronto con quello che avevo fatto io,
anche perchè con gli esempi si impara meglio, poi se voglio fare cose più complesse giustamente come dite voi è meglio imparare sql.

Tornando agli esempi, io facevo le prove di inserimento tabelle e basta tramite l'emulatore, poi chiudevo e con sqlite controllavo se le tabelle erano state create, ma non trovavo niente, mica per caso l'emulatore non scrive sui file .db, e per provare se funziona bisogna installare il file .apk generato nel telefono/smartphone?

Grazie e ciao
 

giannimaione

Well-Known Member
Licensed User
Longtime User
.... e va bene.... se mi è possibile, domani, ti mando un progetto semplice e chiaro.
 

giannimaione

Well-Known Member
Licensed User
Longtime User
Tornando agli esempi, io facevo le prove di inserimento tabelle e basta tramite l'emulatore, poi chiudevo e con sqlite controllavo se le tabelle erano state create, ma non trovavo niente, mica per caso l'emulatore non scrive sui file .db, e per provare se funziona bisogna installare il file .apk generato nel telefono/smartphone?

puoi utilizzare l'emulatore e memorizzare anche un DB! Puoi anche riavviare il tutto PC & emulatore e ritrovare sia le APP che il DB. Fai attenzione alla configurazione di AVD MANAGER.
 

fireblade

Member
Con SQlite database browser ho creato un file "rubrica.db" all'interno una tabella "tabella" (che fantasia) un campo "nome" e un campo "cognome", nel campo nome ho scritto nome, nel campo cognome ho scritto cognome.

Nel progetto ho inserito una Listview e un Button, il mio intendo era quello di cliccare sul Button e popolare la Listview con i 2 campi del database.
Con questa istruzione:
If FirstTime Then
SQL1.Initialize(File.DirDefaultExternal, "rubrica.db", True)
End If
se clicco sul Button si pianta sulla linea 237 int _i = 0;

mentre con questa:
If File.Exists(File.DirInternal,"rubrica.db") = False Then
File.Copy(File.DirAssets,"rubrica.db",File.DirInternal,"rubrica.db")
End If
If SQL1.IsInitialized = False Then
SQL1.Initialize(File.DirInternal, "rubrica.db", True)
End If

si pianta alla linea 242 _cursor1.setObject((android.database.Cursor)(_sql1.ExecQuery("SELECT * FROM rubrica")));

allego il progetto con il relativo database.
 

arenaluigi

Well-Known Member
Licensed User
Longtime User
Ciao,
in allegato il progetto funzionante.
Ma ripeto ho trovato troppi errori di poca esperienza.
Confronta il tuo progetto con quello che ti ho modificato io e cerca di capire dove sono gli errori.
Devi studiare le basi !!!!!!!!

:sign0098:
Ciao
 

fireblade

Member
Intanto grazie mille per il fastidio....

però il tuo progetto corretto non lo posso provare perchè ho la versione 1.80.
Io comunque con la mia versione ho rifatto il progetto con il tuo codice ma premendo sul button non compare nessun errore ne tanto meno nella listview visualizza i campi del database
 

fireblade

Member
nel file .bal in files non trovo la voce background, ma ho aggiunto questo:
lvdb.SingleLineLayout.label.TextColor = Colors.Black
e cmq non vedo niente...
poi per fare la prova del nove ho aggiunto anche:
lvdb.SingleLineLayout.label.Color = Colors.red
ma listview resta bianca così come l'ho impostata io dal designer.

le due stringhe le ho messe nell'evento del button sotto questa riga:
lvdb.AddSingleLine(cursor1.GetString("nome")& " " & cursor1.GetString("cognome"))


poi ancora ho aggiunto un'alto button con questo codice:
lvdb.AddSingleLine("ciao")
e nella listview appare ciao di colore nero, quindi la proprietà del testo della listview è di colore nero
 
Last edited:

fireblade

Member
alla fine riesco a visualizzare i campi nella listview, il problema era che caricavo da AVDmanager le versioni 2.2 e 2.3.3, mentre se carico le versioni 3.0 e 4.1 funziona tutto.
Inoltre ho visto che sbagliavo anche nella posizione SELECT * FROM, dove invece di mettere il nome della tabella, mettevo quello del DB,poi ancora qua
cursor1.GetString("cognome")) avevo messo getlong,ma dove proprio andavo a tentativi era qua:
If Not (File.Exists(File.DirInternal,"rubrica.db")) Then
File.Copy(File.DirAssets, "rubrica.db", File.DirInternal, "rubrica.db")
End If
che dovrebbe essere così:
se nella dirinternal non c'è il file rubrica.db allora copialo da dirAssets.
Mentre questo inizializza i ldb
SQL1.Initialize(File.DirInternal, "rubrica.db", True).

La Dirinternal dovrebbe essere appunto quella interna del telefono, ma nel progetto sarebbe il contenuto della cartella files?

La Direxternal dovrebbe essere appunto la SD del telefono, ma nel progetto è la directory principale?

Infine la DirAssets dovrebbe essere protetta in scrittura, m dove si trova?

Dalla cartella del progetto ho tolto il file .DB sia dalla cartella files che dalla directory principale, e comunque tramite l'emulatore mi carica la listview, come mai?

Installando l'apk nel telefono il .db incluso nel progetto dove va a finire?
Se lo porta dietro i lfile .apk, oppure si deve copiare a mano nel telefono?
 

arenaluigi

Well-Known Member
Licensed User
Longtime User
alla fine riesco a visualizzare i campi nella listview, il problema era che caricavo da AVDmanager le versioni 2.2 e 2.3.3, mentre se carico le versioni 3.0 e 4.1 funziona tutto.
Io uso anche la 2.2 e 2.3.3 e funziona.

La Dirinternal dovrebbe essere appunto quella interna del telefono, ma nel progetto sarebbe il contenuto della cartella files?
La cartella contiene dei file che servono alla tua applicazione per funzionare.
Eccoti comunque una panoramica:
Android stores files in several different locations:
File.DirAssets
These are files distributed with the app in the apk. Files in .DirAssets can be read but not written. In order for files to be included in the apk by B4A, they must be added in the Files tab of the IDE. For adding subfolders to the Files folder, see this post.
File.DirInternal / File.DirInternalCache
These two folders are stored in the main memory and are private to your application. Other applications, including file managers, cannot access these files. The cache folder may get deleted by the OS if it needs more space. If a new version of an app is installed, files in external or DirInternal storage are not disturbed.
The next two areas are external to the main memory. They are usually, but not always, an SD card. For example, the Archos 70-250G table has an internal 250G hard drive but no SD slot, so File.DirRootExternal accesses the hard drive.
File.DirRootExternal
As the name says: the root directory of the "external" storage.
File.DirDefaultExternal
The default folder for an application in external storage. The folder may be accessed by other apps by looking for the path: [external device]/Android/data/[package name]/files/

Dalla cartella del progetto ho tolto il file .DB sia dalla cartella files che dalla directory principale, e comunque tramite l'emulatore mi carica la listview, come mai?
Normale.La prima volta che avvia l'app con l'istruzione copy, il db è residente nel device.Perciò hai voglia ad eliminarlo dal progetto.Dovresti aprire un tool che trovi nella cartella dell sdk android, si chiama ddms.bat se non ricordo male, tra le tante funzionalità ti permette di esplorare il device e cancellare il db fisicamente dal device.

Installando l'apk nel telefono il .db incluso nel progetto dove va a finire?
Se lo porta dietro i lfile .apk, oppure si deve copiare a mano nel telefono?

Ogni app che tu crei ha un suo package name.
Perciò nel device il db lo troverai nella cartella del tuo package "database" il percorso dovrebbe essere :
data/data/com.example.helloandroid/database

Spero che ti sia tutto più chiaro.
Guarda i beginner tutorial :sign0098:
 

fireblade

Member
grazie per tutto l'aiuto, sei molto chiaro, io cmq cerco di leggere quanto più possibile, però il problema principale mio è l'inglese....
tornando al database, se resta cmq nell'emulatore, però io ho aggiunto qualche record a mano tramite sqlite databse manager, (sto provando ad aggiungere nuovi record tramite codice ma non riesco) nel cartella del progetto però la listview mi fa vedere sempre solo quelli iniziali, e come se non legge più il db appena editato, ma bensi quello che come dici tu resta nell'emulatore.
ora provo con ddms.bat ad eliminarlo.

P.S. visto che hai fatto tanto, perchè nel progetto non mi dici come inserire nuovi record?

Grazie
 

arenaluigi

Well-Known Member
Licensed User
Longtime User
Per sostituire il database, basta che sostituisci questa riga di codice:
B4X:
If Not (File.Exists(File.DirInternal,"rubrica.db")) Then
File.Copy(File.DirAssets, "rubrica.db", File.DirInternal, "rubrica.db")
End If

con

B4X:
If  (File.Exists(File.DirInternal,"rubrica.db")) Then
File.Copy(File.DirAssets, "rubrica.db", File.DirInternal, "rubrica.db")
End If
In pratica tira via il not, attenzione perchè ogni volta lo ricrea.

Appena ho due minuti ti giro un esempio.
 

fireblade

Member
ho seguito il tuo consiglio e con ddms.bat ho eliminato il file .db, e in questo modo il progetto mi vede il file .db che ho modificato a mano.
Per non darti tanto fastidio, faccio un progetto nuovo come servirebbe a me, (con poche cose) poi lo allego e gli dai uno sguardo.

Cmq valgono più i tuoi esempi....se leggendo i testi in inglese dovevo apprendere tutto quello che ho appreso in 2 giorni con te, mi ci volevano 6 mesi e anche più.
 
Top