Προγραμματισμός του SQLite στο C Tutorial Two

click fraud protection

Αυτό το σεμινάριο είναι το δεύτερο σε σειρά σχετικά με προγραμματισμός SQLite στο C.

SQLite αποθηκεύει μια συλλογή πινάκων σε ένα μόνο αρχείο βάση δεδομένων, συνήθως τελειώνοντας σε .db. Κάθε πίνακας είναι σαν ένα υπολογιστικό φύλλο, αποτελείται από έναν αριθμό στηλών και κάθε σειρά έχει τιμές.

Αν βοηθάει, σκεφτείτε κάθε σειρά ως α struct, με την στήλες στον πίνακα που αντιστοιχούν στα πεδία της δομής.

Ένας πίνακας μπορεί να έχει όσες σειρές θα χωρέσει σε ένα δίσκο. Υπάρχει ένα ανώτατο όριο, αλλά το τεράστιο 18.446.744.073.705.551.616 για να είμαστε ακριβείς.

Ένας πίνακας μπορεί να έχει έως και 2.000 στήλες ή αν επανασυναρμολογήσετε την πηγή, μπορείτε να το μεγιστοποιήσετε σε μια εκπληκτική στήλη 32.767.

Το API SQLite

Για να χρησιμοποιήσετε το SQLite, πρέπει να πραγματοποιήσουμε κλήσεις στο API. Μπορείτε να βρείτε μια εισαγωγή στο εν λόγω API στον υπάλληλο Εισαγωγή στη διεπαφή SQLite C / C ++ ιστοσελίδα. Είναι μια συλλογή λειτουργιών και εύκολη στη χρήση.

Πρώτον, χρειαζόμαστε μια λαβή στη βάση δεδομένων. Αυτό είναι τύπου sqlite3 και επιστρέφεται από μια κλήση στο sqlite3_open (όνομα αρχείου, ** ppDB). Μετά από αυτό, εκτελούμε το

instagram viewer
SQL.

Ας πάρουμε πρώτα μια μικρή απόκλιση και δημιουργήσαμε μια βάση δεδομένων και μερικούς πίνακες που χρησιμοποιούν το SQLiteSpy. (Δείτε το προηγούμενο σεμινάριο για συνδέσμους προς αυτό και το SQLite Database Browser).

Εκδηλώσεις και χώροι

Η βάση δεδομένων για το. Το DB θα διαθέτει τρία τραπέζια για τη διαχείριση εκδηλώσεων σε διάφορους χώρους. Αυτές οι εκδηλώσεις θα είναι πάρτι, ντίσκο και συναυλίες και θα πραγματοποιηθούν σε πέντε χώρους (άλφα, βήτα, charlie, δέλτα και ηχώ). Όταν σχεδιάζετε κάτι τέτοιο, συχνά βοηθά να ξεκινήσετε με ένα υπολογιστικό φύλλο. Για λόγους απλότητας, θα αποθηκεύσω μόνο μια ημερομηνία και όχι μια ώρα.

Το υπολογιστικό φύλλο έχει τρεις στήλες: Ημερομηνίες, Χώρος, Τύπος συμβάντος και περίπου δέκα γεγονότα όπως αυτό. Οι ημερομηνίες ξεκινούν από τις 21 έως τις 30 Ιουνίου 2013.

Τώρα το SQLite δεν έχει ρητό τύπο ημερομηνίας, επομένως είναι ευκολότερο και ταχύτερο να το αποθηκεύσετε ως int και με τον ίδιο τρόπο που χρησιμοποιεί το Excel ημερομηνίες (ημέρες από 1 Ιανουαρίου 1900) έχουν τιμές int 41446 έως 41455. Εάν τοποθετήσετε τις ημερομηνίες σε ένα υπολογιστικό φύλλο και κατόπιν διαμορφώσετε τη στήλη ημερομηνίας ως έναν αριθμό με 0 δεκαδικά ψηφία, φαίνεται κάτι τέτοιο:

Τώρα μπορούμε να αποθηκεύσουμε αυτά τα δεδομένα σε έναν πίνακα και για ένα τόσο απλό παράδειγμα, θα ήταν πιθανώς αποδεκτό. Ωστόσο, η καλή πρακτική σχεδίασης βάσεων δεδομένων απαιτεί κάποιες ομαλοποίηση.

Τα μοναδικά στοιχεία δεδομένων όπως ο τύπος του χώρου θα πρέπει να βρίσκονται στον δικό του πίνακα και οι τύποι συμβάντων (συμβαλλόμενο μέρος κ.λπ.) θα πρέπει επίσης να είναι σε ένα. Τέλος, καθώς μπορούμε να έχουμε πολλούς τύπους συμβάντων σε πολλαπλούς χώρους (πολλές από πολλές σχέσεις) χρειαζόμαστε έναν τρίτο πίνακα για να τις κρατήσουμε.

Οι τρεις πίνακες είναι:

  • χώρους συγκέντρωσης - κρατά και τους πέντε χώρους
  • eventtypes - περιέχει και τους τρεις τύπους συμβάντων
  • γεγονότα - κατέχει την ημερομηνία συν το αναγνωριστικό του χώρου και το αναγνωριστικό τύπου συμβάντος. Προστέθηκα επίσης ένα πεδίο περιγραφής για αυτό το γεγονός, π.χ. "Birthday of Jim".

Οι δύο πρώτοι πίνακες κρατούν τους τύπους δεδομένων, έτσι ώστε οι τόποι να έχουν ονόματα άλφα προς ηχώ. Έχω προσθέσει ένα αναγνωριστικό ακέραιου αριθμού επίσης και δημιούργησε ένα ευρετήριο για αυτό. Με το μικρό αριθμό χώρων (5) και τύπων συμβάντων (3), θα μπορούσε να γίνει χωρίς δείκτη, αλλά με μεγαλύτερους πίνακες, θα γίνει πολύ αργός. Επομένως, οποιαδήποτε στήλη πιθανόν να αναζητηθεί, προσθέστε ένα ευρετήριο, κατά προτίμηση ακέραιο

Η SQL για να δημιουργήσει αυτό είναι:

Ο δείκτης στον πίνακα συμβάντων έχει ημερομηνία, συμβάν id, τον τύπο συμβάντος και τον τόπο συναντήσεως. Αυτό σημαίνει ότι μπορούμε να διερωτήσουμε τον πίνακα γεγονότων για "όλα τα γεγονότα σε μια ημερομηνία", "όλα τα γεγονότα σε ένα χώρο", "όλα τα μέρη" κλπ. Και συνδυασμούς αυτών όπως "όλα τα μέρη σε ένα χώρο" κλπ.

Αφού εκτελέσετε τα ερωτήματα πίνακα δημιουργίας SQL, δημιουργούνται οι τρεις πίνακες. Σημείωση Έχω βάλει όλα αυτά sql στο αρχείο κειμένου create.sql και περιλαμβάνει τα δεδομένα για τη γεφύρωση μερικών από τους τρεις πίνακες.

Αν βάζεις? στο τέλος των γραμμών όπως έχω κάνει στο create.sql τότε μπορείτε να παρτίδα και να εκτελέσετε όλες τις εντολές σε ένα πάει. Χωρίς το; πρέπει να τρέξετε το καθένα από μόνο του. Στο SQLiteSpy, απλώς κάντε κλικ στο F9 για να εκτελέσετε τα πάντα.

Έχω επίσης συμπεριλάβει sql να ρίξει και τα τρία τραπέζια μέσα στα σχόλια πολλών γραμμών χρησιμοποιώντας / *.. * / ίδιο όπως στο C. Απλά επιλέξτε τις τρεις γραμμές και κάντε ctrl + F9 για να εκτελέσετε το επιλεγμένο κείμενο.

Αυτές οι εντολές εισάγουν τους πέντε τόπους:

Και πάλι έχω συμπεριλάβει σχολιασμένο κείμενο για κενά πίνακες, με το διαγραφή από γραμμές. Δεν υπάρχει καμία αναίρεση να είστε προσεκτικοί με αυτά!

Εκπληκτικά, με όλα τα δεδομένα που φορτώθηκαν (βεβαίως όχι πολύ) όλο το αρχείο βάσης δεδομένων στο δίσκο είναι μόνο 7KB.

Δεδομένα συμβάντων

Αντί να δημιουργήσουμε μια δέσμη δέκα ενθέτων, χρησιμοποίησα το Excel για να δημιουργήσω ένα αρχείο .csv για τα δεδομένα συμβάντων και στη συνέχεια χρησιμοποιήθηκε το βοηθητικό πρόγραμμα γραμμής εντολών SQLite3 (που συνοδεύει το SQLite) και τις ακόλουθες εντολές για εισαγωγή το.

Σημείωση: Κάθε γραμμή με πρόθεμα περιόδου (.) Είναι μια εντολή. Χρησιμοποιήστε το help. Για να δείτε όλες τις εντολές. Για να εκτελέσετε SQL, πληκτρολογήστε τον μόνο χωρίς πρόθεμα περιόδου.

Πρέπει να χρησιμοποιήσετε διπλά μαύρα όρια \\ στη διαδρομή εισαγωγής για κάθε φάκελο. Μόνο η τελευταία γραμμή μετά την επιτυχία του .import. Όταν εκτελείται το SQLite3 ο προεπιλεγμένος διαχωριστής είναι a: οπότε πρέπει να αλλάξει σε κόμμα πριν από την εισαγωγή.

Επιστροφή στον Κώδικα

Τώρα έχουμε μια πλήρως συμπληρωμένη βάση δεδομένων, ας γράψουμε το C κώδικα για να εκτελέσετε αυτό το ερώτημα SQL που επιστρέφει μια λίστα με τα μέρη, με περιγραφή, ημερομηνίες και χώρους.

  • Νέα στο SQL; Διαβάστε τι είναι το SQL;

Αυτό γίνεται με τη χρήση της στήλης ανανέωσης μεταξύ του πίνακα γεγονότων και χώρων συναντήσεων, έτσι ώστε το όνομα του χώρου να μην είναι η τιμή int του εισοδήματος.

Οι λειτουργίες API του SQLite C

Υπάρχουν πολλές λειτουργίες, αλλά χρειαζόμαστε μόνο μια χούφτα. Η σειρά επεξεργασίας είναι:

  1. Ανοίξτε τη βάση δεδομένων με το sqlite3_open (), αν έχετε ανοίξει σφάλμα.
  2. Προετοιμασία του SQL με sqlite3_prepare ()
  3. Βρόχος χρησιμοποιώντας το slqite3_step () έως ότου δεν υπάρχουν άλλα αρχεία
  4. (Στον βρόχο) επεξεργαστείτε κάθε στήλη με sqlite3_column ...
  5. Τέλος, καλέστε sqlite3_close (db)

Υπάρχει ένα προαιρετικό βήμα μετά την κλήση του sqlite3_prepare όπου έχουν περάσει παραμέτρους που έχουν περάσει, αλλά θα το αποθηκεύσουμε για ένα μελλοντικό εκπαιδευτικό πρόγραμμα.

Έτσι στο παρακάτω πρόγραμμα ο ψευδοκώδικας για τα κύρια βήματα είναι:

Το sql επιστρέφει τρεις τιμές έτσι ώστε αν sqlite3.step () == SQLITE_ROW τότε οι τιμές αντιγράφονται από τους κατάλληλους τύπους στήλης. Έχω χρησιμοποιήσει int και κείμενο. Εμφανίζω την ημερομηνία ως αριθμό, αλλά μπορείτε να την μετατρέψετε σε ημερομηνία.

Καταχώρηση του κωδικού παραδειγμάτων

instagram story viewer