Acasă Flori de interior Descărcați Aida 64 pentru Windows 7. Versiunea rusă Aida64 Extreme Edition. Aplicație mobilă AIDA64

Descărcați Aida 64 pentru Windows 7. Versiunea rusă Aida64 Extreme Edition. Aplicație mobilă AIDA64

Să creăm o aplicație simplă de bază de date care afișează informații din tabelul „Turisti” și o înregistrare a tabelului „Informații turistice” dintr-o bază de date Microsoft Access asociată cu înregistrarea curentă a tabelului Turisti.

Pentru a face acest lucru, să creăm o aplicație Windows goală. Aspectul mediului

dezvoltarea este prezentată în Figura 39.

Orez. 39. Aplicație goală

În Figura 39, este evidențiat grupul de componente „Date”, care conține componente pentru accesarea și manipularea datelor.

Legarea datelor bazei de date la formular este realizată de componenta „Binding Source”. Să-l transferăm în formular. După plasarea acestuia pe formular, mediul de dezvoltare ia următoarea formă (Fig. 40).

Orez. 40. Sursa de legare a componentelor din formular

Componenta nu este vizuală, deci este afișată într-un panou suplimentar. Proprietatea principală a componentei este proprietatea DataSource, care indică sursa de date. În mod implicit, proprietatea este goală, deci trebuie să-i formați valoarea. Când această proprietate este selectată, următoarea fereastră apare în fereastra de proprietăți (Fig. 41).

Orez. 41. Lista surselor de date

Lista este în prezent goală, deci trebuie să creați o nouă sursă de date alegând comanda Adăugare sursă de date a proiectului pentru a crea o nouă sursă de date și a vă conecta la aceasta. Apare următoarea casetă de dialog (fig. 42).

Orez. 42. Lista surselor de date

Acest dialog oferă următoarea selecție a surselor de date:

Baza de date - Baza de date;

Serviciu - Un serviciu este un fel de serviciu care oferă date. Cel mai adesea acesta este un serviciu Web;

Obiect - Un obiect pentru selectarea unui obiect care va genera date și obiecte cu care să lucreze.

În cazul nostru, trebuie să selectați elementul „Baza de date”. Apare o fereastră pentru selectarea unei conexiuni de date (Fig. 43).

Orez. 43. Alegerea unei conexiuni de date

Scopul acestui dialog este de a crea un șir de conexiune care va descrie parametrii de conexiune pentru motorul ADO, cum ar fi tipul bazei de date, locația sa, numele de utilizator, caracteristicile de securitate etc.

Lista derulantă a dialogului conține toate conexiunile create anterior. Dacă conexiunea necesară nu este în listă, atunci ar trebui să utilizați butonul „Conexiune nouă”. Apăsarea butonului duce la apariția următorului dialog (Fig. 44).

În acest dialog, selectați tipul sursei de date (în acest caz Microsoft Access), numele bazei de date (în acest caz, numele și locația fișierului bazei de date), numele de utilizator și parola utilizate pentru conectarea la baza de date. Butonul „Avansat” vă permite să setați un număr mare de parametri legați de diferite părți ale mecanismului ADO. Utilizarea butonului „Testare conexiune” vă va asigura că parametrii introduși sunt corecți și că conexiunea funcționează.

Orez. 44. Crearea unei noi conexiuni

Ultimul pas al dialogului este să selectați acele tabele sau alte obiecte de bază de date care sunt necesare în această sursă de date. Fereastra de selecție este prezentată în Figura 45.

Orez. 45. Selectarea tabelelor necesare

În această fereastră sunt selectate tabelele „Turiști” și „Informații turistice”. Deoarece în baza de date nu au fost create alte obiecte decât tabele, numai tabelele sunt afișate în Figura 45. Aceasta finalizează crearea sursei de date. Când faceți clic pe Finalizare, un set de date apare lângă BindingSource pe formular.

Acum datele conectate mai sus trebuie să fie afișate pe formular. Cea mai simplă modalitate de afișare a datelor este utilizarea componentei DataGridView din grupul de componente Date. Componenta este vizuală și arată astfel în formular (Fig. 46).

Orez. 46. ​​Component DataGridView

Apare imediat fereastra de setări a componentelor, care determină capacitățile sale de editare a datelor: „Enable Adding”, „Enable Editing”, „Enable Deleting”; capacitatea de a schimba succesiunea coloanelor: „Activați reordonarea coloanelor”; și, de asemenea, capacitatea de a andoca în containerul părinte.

Pentru ca componenta să afișeze date, trebuie să selectați o sursă de date în lista derulantă. Alegerea listei derulante duce la apariția următorului dialog (Fig. 47).

Orez. 47. Selectarea unei surse de date pentru DataGridView

În acest caz, am selectat tabelul „Turiști” ca sursă de date. Această selecție modifică afișajul după cum urmează (Fig. 48).

Orez. 48. Component DataGridView afișează structura tabelului

În figură, puteți vedea că există o altă componentă BindingSource și o componentă TableAdapter care funcționează cu tabelul Turisti. Vă rugăm să rețineți că în timpul proiectării sau în timpul dezvoltării, datele din tabel nu sunt afișate.

Acum trebuie să afișați datele din tabelul de informații turistice conectat. Pentru aceasta, plasați o altă componentă DataGridView pe formular și selectați următoarele ca sursă de date (Fig. 49).

Orez. 49. Selectarea unei surse de date pentru al doilea DataGridView

Aici, sursa de date nu este tabelul „Informații turistice” în sine, ci sursa obligatorie dintre tabelele „Turisti” și „Informații turistice”. Această selecție asigură că numai acele rânduri sunt selectate din tabelul Informații turistice care sunt asociate cu rândul curent din tabelul Turisti. De asemenea, se asigură că datele asociate sunt actualizate și șterse corect. Funcționarea aplicației rezultate este prezentată în Figura 50.

Orez. 50. Aplicația bazei de date la locul de muncă

Navigarea prin date folosind tastele săgeată este incomodă. Există o componentă BindingNavigator pentru a simplifica navigarea prin date. Așezați-l pe formular (fig. 51).

Orez. 51. Componenta BindingNavigator din formular

Această componentă vă permite să navigați între înregistrările tabelului, să adăugați și să ștergeți rânduri de tabel. Funcționalitatea și aspectul componentei sunt personalizabile, deoarece este o bară de meniu ToolStripContainer.

Proprietatea care definește tabelul care urmează să fie navigat este proprietatea BindingSource. Setați valoarea acestei proprietăți la TouristBindingSource. În funcțiune, componenta arată astfel (Fig. 52).

Orez. 52. Componenta BindingNavigator la locul de muncă

Editarea datelor în celulele componentei DataGridView cu setări adecvate este posibilă, dar incomodă și nu rațională. În special, este dificil să verificați valorile introduse pentru erori. Prin urmare, pentru tabelul „Turiști”, vom crea un formular de ecran care permite afișarea datelor în componentele TextBox și editarea acestora. Pentru a face acest lucru, plasați un container de tip Panou pe formular și pe acesta trei componente TextBox după cum urmează (Fig. 53).

Orez. 53. Panou ecran pentru editarea înregistrărilor tabelului „Turiști”

Acum este necesar să legați componentele TextBox la câmpurile corespunzătoare din tabelul „Turisti”. Pentru a face acest lucru, utilizați proprietatea din grupul DataBindings - Advanced, prezentată în Figura 54.

Orez. 54. Proprietatea "DataBindings - Advanced"

Selectarea acestei proprietăți duce la apariția dialogului prezentat în Figura 55. Acest dialog vă permite să efectuați nu numai legarea datelor, ci și să setați un eveniment în cadrul căruia datele vor fi actualizate, precum și formatarea datelor atunci când sunt afișate. .

Pentru componenta de top TextBox din lista derulantă Binding, selectați sursa de date „turiștiBmdmgSursă” și câmpul sursă - „Numele de familie”. Pentru componentele TextBox din mijloc și din partea de jos, selectați aceeași sursă de date și respectiv câmpurile „Nume” și „Patronim”.

Aplicația dezvoltată în funcțiune arată după cum urmează (Fig. 56).

Orez. 55. Casetă de dialog pentru proprietatea „DataBindings - Advanced”

Orez. 56. Legarea datelor la componentele vizuale

Cu toate acestea, când se fac modificări, toate datele noi rămân doar în formular. Nu sunt stocate în baza de date și, bineînțeles, nu vor fi prezente atunci când aplicația este apelată din nou. Acest lucru se datorează faptului că datele au fost încărcate într-un DataSet, care este o copie a tabelului în memorie. Toate acțiunile sunt efectuate cu această copie. Pentru ca modificările să fie reflectate în baza de date, trebuie să executați metoda de actualizare a clasei TableAdapter. Astfel, în aplicația dezvoltată este necesar să plasați butonul Actualizare și să scrieți următorul cod de program în gestionarul de evenimente Click:

turiștiTabelAdapteGUpdate (bDTur_firmDataSet); info_about_touristsTableAdapter.Update (bDTur_firmDataSet);

Acest cod actualizează informațiile din tabelele „Turiști” și „Informații turistice” furnizate de sursa de date. Rețineți că această metodă este supraîncărcată, iar variantele sale vă permit să actualizați atât un singur rând al unui tabel, cât și un grup de rânduri.

DbVisualizer 9.1.5

DbVisualizer este un instrument de baze de date pentru dezvoltatori și administratori de baze de date, care vă ajută atât la dezvoltarea, cât și la întreținerea bazelor de date.

Firebird 2.5.2

Firebird este o bază de date relațională care oferă multe caracteristici standard ANSI SQL care rulează pe Linux, Windows și o varietate de platforme Unix. Firebird oferă concurență excelentă, performanță ridicată și suport puternic de limbaj pentru proceduri și declanșatoare stocate.

Reitec.PMM 1.2.1.0

Reitec.PMM este un instrument gratuit pentru gestionarea echipamentelor de testare ca parte a asigurării calității.

WowBase 1.1

Creați-vă propria bază de date rapid și ușor.

MyContacts 3.1

Gestionarea contactelor, zilelor de naștere și a datelor / sarcinilor.

LibreOffice Rus pentru Windows 3.6.4

Suita de birou LibreOffice este cea mai bună alternativă gratuită pentru Microsoft Office 2003, 2007 și chiar 2010.

PhpMyAdmin 3.5.3

phpMyAdmin Rus este un program pentru gestionarea unei baze de date MySQL, care poate fi descărcată și utilizată gratuit - atât acasă, cât și în organizație. Versiunea rusă.

Oracle MySQL pentru Linux, UNIX, * BSD și altele * nix 5.5.28 Final / 6.0.6 Beta

Oracle MySQL - Un server de baze de date bine cunoscut. Faimos pentru stabilitatea și viteza impecabilă.

Oracle MySQL pentru Windows 5.5.28 Final / 6.0.6 Beta

MySQL este una dintre cele mai populare baze de date open source pe care le puteți descărca și utiliza gratuit.

  • Dezvoltare pentru Android,
  • SQLite
    • Tutorial
    • Mod de recuperare

    Bună ziua tuturor! Numele meu este Oleg și sunt programator amator pentru Android. Un amator pentru că în acest moment câștig bani programând într-o direcție complet diferită. Și acesta este un hobby căruia îi dedic timpul liber. Din păcate, nu am programatori Android familiari și îmi extrag toate cunoștințele de bază fie din cărți, fie de pe Internet. În toate acele cărți și articole de pe Internet pe care le-am citit, foarte puțin spațiu este alocat pentru crearea unei baze de date pentru aplicație și, de fapt, întreaga descriere se reduce la crearea unei clase care este moștenitor SQLiteOpenHelperși injectarea ulterioară a codului SQL în codul Java. În afară de faptul că obținem un cod slab lizibil (și dacă apar mai mult de 10 tabele în aplicația noastră, atunci amintirea tuturor acestor relații între tabele este încă iad), atunci, în principiu, poți trăi, desigur, dar cumva tu absolut nu vreau.
    Am uitat să spun cel mai important lucru, putem spune că acesta este testul meu de stilou aici. Și așa am mers.

    Cu privire la veșnica întrebare: de ce?

    De ce, în cărțile și articolele dedicate programării pentru Android, nu sunt descrise instrumentele pentru proiectarea arhitecturii bazelor de date și niciun model pentru lucrul cu bazele de date în etapa de creare a acestora, sincer nu știu. S-ar părea să adauge doar câteva pagini la o carte sau să scrie un articol separat (așa cum fac acum) la fel de ușor ca decojirea perelor - dar nu. În acest articol, voi parcurge pe scurt instrumentele pe care le folosesc în munca mea și mai detaliat asupra codului care este responsabil pentru crearea inițială a bazei de date, care, din punctul meu de vedere, arată mai ușor de citit și mai convenabil.


    Dacă aplicația noastră are mai mult de 5 tabele, atunci ar fi bine să folosim un instrument pentru proiectarea vizuală a arhitecturii bazei de date. Deoarece acesta este un hobby pentru mine, folosesc un instrument absolut gratuit numit Oracle SQL Developer Data Modeler (îl puteți descărca).

    Acest program vă permite să desenați vizual tabele și să construiți relații cu acestea. Multe greșeli de proiectare în arhitectura bazelor de date pot fi evitate cu această abordare de proiectare (vă spun deja asta ca programator de baze de date profesionale). Arată cam așa:

    După ce am proiectat arhitectura în sine, trecem la partea mai plictisitoare, care constă în crearea codului sql pentru crearea tabelelor. Pentru a ajuta în această chestiune, folosesc deja un instrument numit SQLiteStudio (care la rândul său poate fi descărcat de aici).

    Acest instrument este similar cu produse cunoscute precum SQL Naviagator, Toad etc. Dar, după cum sugerează și numele, este adaptat pentru a lucra cu SQLite. Vă permite să creați vizual o bază de date și să obțineți codul DDL al tabelelor care sunt create. Apropo, vă permite, de asemenea, să creați Vizualizări, pe care le puteți utiliza și în aplicația dvs., dacă doriți. Nu știu cât de corectă este abordarea utilizării vizualizărilor în programele Android, dar într-una dintre aplicațiile mele le-am folosit.

    De fapt, nu mai folosesc instrumente terțe și apoi magia începe cu Android Studio. Așa cum am scris mai sus, dacă începeți să injectați cod SQL în codul Java, atunci ieșirea va fi slab lizibilă și, prin urmare, codul extensibil slab. Prin urmare, transfer toate instrucțiunile SQL în fișiere externe care se află în director active... În Android Studio, arată cam așa:


    Despre directoarele de date și date

    În interiorul directorului active Am creat două directoare db_01și date_01... Numerele din numele directoarelor corespund cu numărul versiunii bazei mele de date cu care lucrez. În director db Stoc scripturile SQL pentru crearea tabelelor. Și în director date datele necesare pentru umplerea inițială a tabelelor sunt stocate.


    Acum să aruncăm o privire la codul din interiorul meu DBHelper pe care le folosesc în proiectele mele. Mai întâi variabilele de clasă și constructorul (fără surprize aici):

    Șir final static privat TAG = "RoadMap4.DBHelper"; Șir mDb = "db_"; Șir mData = "date_"; Context mContext; int mVersion; public DBHelper (context context, nume șir, versiune int) (super (context, nume, nul, versiune); mContext = context; mVersion = versiune;)
    Acum metoda onCreateși aici devine mai interesant:

    @Override public void onCreate (SQLiteDatabase db) (ArrayList tabele = getSQLTables (); for (String table: tables) (db.execSQL (tabel);) ArrayList > dataSQL = getSQLDatas (); pentru (HashMap hm: dataSQL) (pentru (String table: hm.keySet ()) (Log.d (TAG, "insert in" + table + "" + hm.get (table)); long rowId = db.insert (table, nul, hm.get (tabel));)))
    În mod logic, este împărțit în două bucle, în prima buclă obțin o listă de instrucțiuni SQL pentru crearea unei baze de date și apoi le execut, în a doua buclă deja completez tabelele create anterior cu date inițiale. Și așa, primul pas:

    Private ArrayList getSQLTables () (ArrayList tabele = ArrayList nou<>(); ArrayList files = new ArrayList<>(); AssetManager assetManager = mContext.getAssets (); String dir = mDb + mVersion; try (String listFiles = assetManager.list (dir); for (String file: listFiles) (files.add (file);) Collections.sort (files, new QueryFilesComparator ()); BufferedReader bufferedReader; String query; String line; for (String file: files) (Log.d (TAG, "file db is" + file); bufferedReader = new BufferedReader (new InputStreamReader (assetManager.open (dir + "/" + file))); query = ""; while ((line = bufferedReader.readLine ())! = null) (interogare = interogare + linie;) bufferedReader.close (); tables.add (interogare);)) catch (IOException e) (e.printStackTrace (); ) tabele de returnare; )
    Totul este destul de simplu aici, doar citim conținutul fișierelor și concatenăm conținutul fiecărui fișier într-un element matrice. Vă rugăm să rețineți că sortez lista de fișiere, deoarece tabelele pot avea chei străine, ceea ce înseamnă că tabelele trebuie create într-o anumită ordine. Folosesc numerotarea în numele fișierelor și cu ajutorul acesteia fac sortarea.

    Clasa privată QueryFilesComparator implementează Comparator (@Override public int compare (String file1, String file2) (Integer f2 = Integer.parseInt (file1.substring (0, 2)); Integer f1 = Integer.parseInt (file2.substring (0, 2)); return f2 .compareTo (f1);))
    Odată cu completarea tabelelor, totul este mai distractiv. Tabelele mele sunt umplute nu numai cu valori codificate, ci și cu valori din resurse și chei UUID (sper ca într-o zi să ajung la versiunea de rețea a programului meu, astfel încât utilizatorii mei să poată lucra cu date partajate). Structura fișierelor de date inițiale arată astfel:


    În ciuda faptului că fișierele mele au extensia sql, nu există cod sql în interior, dar acest lucru:

    Priorități
    pri_id: UUID: UUID

    pri_name: șir: normal
    pri_color: color: colorGreen
    pri_default: int: 1
    priorități
    pri_id: UUID: UUID
    pri_object: șir: obiect_task
    pri_name: string: hold
    pri_color: color: colorBlue
    pri_default: int: 0
    priorități
    pri_id: UUID: UUID
    pri_object: șir: obiect_task
    pri_name: șir: important
    pri_color: color: colorRed
    pri_default: int: 0
    priorități
    pri_id: UUID: UUID

    pri_name: șir: normal
    pri_color: color: colorGreen
    pri_default: int: 1
    priorități
    pri_id: UUID: UUID
    pri_object: șir: obiect_proiect
    pri_name: string: hold
    pri_color: color: colorBlue
    pri_default: int: 0
    priorități
    pri_id: UUID: UUID
    pri_object: șir: obiect_proiect
    pri_name: șir: important
    pri_color: color: colorRed
    pri_default: int: 0

    Structura fișierului este astfel: fac un apel funcțional Despică (":")în legătură cu o linie și dacă obțin că dimensiunea sa este 1, atunci acesta este numele tabelului în care ar trebui să fie scrise datele. În caz contrar, sunt datele în sine. Primul câmp este numele câmpului din tabel. Al doilea câmp este tipul prin care stabilesc ce trebuie să scriu chiar în acest câmp. Dacă este un UUID, înseamnă că trebuie să generez o valoare UUID unică. Dacă șir înseamnă că trebuie să extrag valoarea șirului din resurse. Dacă culoare, atunci din nou, trebuie să extrageți codul de culoare din resurse. Dacă int sau text, atunci convertesc valoarea dată în int sau șir fără niciun gest. Codul în sine arată astfel:

    Private ArrayList > getSQLDatas () (ArrayList > date = new ArrayList<>(); ArrayList files = new ArrayList<>(); AssetManager assetManager = mContext.getAssets (); String dir = mData + mVersion; try (String listFiles = assetManager.list (dir); for (String file: listFiles) (files.add (file);) Collections.sort (files, new QueryFilesComparator ()); BufferedReader bufferedReader; String line; int separator = 0 ; ContentValues ​​cv = null; Câmpuri șir; String nameTable = null; String packageName = mContext.getPackageName (); flag boolean = false; HashMap hm; for (String file: files) (Log.d (TAG, "file db is" + file); bufferedReader = new BufferedReader (new InputStreamReader (assetManager.open (dir + "/" + file))); while ((line = bufferedReader.readLine ())! = null) (fields = line.trim (). split (":"); if (fields.length == 1) (if (flag == true) (hm = new HashMap<>(); hm.put (nameTable, cv); data.add (hm); ) // numele tabelului nameTable = line.trim (); cv = new ContentValues ​​(); continua; ) else (if (fields.equals ("UUID")) (cv.put (fields, UUID.randomUUID (). toString ());) else if (fields.equals ("color") || fields.equals ( "șir")) (int resId = mContext.getResources (). getIdentifier (câmpuri, câmpuri, numePachet); Log.d (TAG, câmpuri + "" + resId); comutator (câmpuri) (caz "culoare": cv. put (câmpuri, resId); break; case "string": cv.put (câmpuri, mContext.getString (resId)); break; implicit: break;)) else if (fields.equals ("text")) (cv .put (câmpuri, câmpuri);) else if (fields.equals ("int")) (cv.put (câmpuri, Integer.parseInt (câmpuri));)) flag = true; ) bufferedReader.close (); )) catch (IOException e) (e.printStackTrace ();) return date; )

    Nou pe site

    >

    Cel mai popular