मालवेअर हे अनाहूत किंवा धोकादायक प्रोग्राम आहेत जे...
![व्हायरस आणि मालवेअर काढून टाकण्यासाठी सर्वोत्तम उपयुक्तता](https://i2.wp.com/webhelper.info/images/danger.jpg)
डेटाबेस ही टेबल्समध्ये आयोजित केलेली रेकॉर्ड संग्रहित करण्याची एक प्रणाली आहे. डेटाबेसमध्ये एकमेकांशी जोडलेली एक ते शंभर टेबल असू शकतात. सारणीमध्ये पंक्ती आणि स्तंभांचा संच असतो. सारणी स्तंभांना नावे आहेत आणि त्या प्रत्येकाला एक प्रकार आणि/किंवा मूल्य श्रेणी नियुक्त केली आहे. डेटाबेस टेबलच्या पंक्तींना रेकॉर्ड म्हणतात आणि ज्या सेलमध्ये रेकॉर्ड विभागले जाते त्यांना फील्ड म्हणतात.
प्राथमिक कळ आहे अद्वितीय ओळखकर्ता, जे केवळ एका स्तंभाचेच नव्हे तर स्तंभांचे संपूर्ण संयोजन देखील दर्शवू शकते.
वापरकर्ता अनेक कामगिरी करू शकतो विविध ऑपरेशन्ससारण्यांसह, उदाहरणार्थ: रेकॉर्ड जोडणे, बदलणे आणि हटवणे, शोधणे इ. अशा प्रकारच्या क्वेरी तयार करण्यासाठी, ते विकसित केले गेले. SQL भाषा(स्ट्रक्चर्ड क्वेरी लँग्वेज), ज्यामुळे केवळ डेटा क्वेरी करणे आणि बदलणे शक्य होत नाही तर नवीन डेटाबेस तयार करणे देखील शक्य होते.
डेटाबेससह केलेल्या मुख्य क्रिया तयार केल्या जातात नवीन टेबल, वाचन (नमुना आणि प्रक्षेपण), डेटा घालणे, सुधारित करणे आणि हटवणे. ती भाषा लगेच म्हणायला हवी SQLकेस असंवेदनशील आहे, ज्याचा अर्थ असा आहे की अक्षर मोठ्या अक्षरात टाइप केले आहे किंवा लोअरकेस, समान मानले जाते. उदाहरणार्थ, SELECT = select = सिलेक्ट, इ. पुढील गोष्टींमध्ये, आम्ही SQL कीवर्ड हायलाइट करण्यासाठी अप्परकेस वापरू.
प्रश्न भाषा SQLमध्ये वापरले जाणारे एक मानक आहे मोठ्या संख्येने DBMS, जे प्लॅटफॉर्मचे स्वातंत्र्य सुनिश्चित करते. क्वेरी (आदेश) हे डेटाबेसला विचारले जाणारे एक प्रकारचे प्रश्न आहेत, ज्याची उत्तरे दिली पाहिजेत.
डेटाबेससह कार्य करण्यासाठी, आपण प्रथम ड्राइव्हर सक्रिय करणे आवश्यक आहे आणि नंतर डेटाबेससह कनेक्शन स्थापित करणे आवश्यक आहे. त्यानंतर तुम्ही SQL क्वेरी वापरून डेटा पुनर्प्राप्त करू शकता, समाविष्ट करू शकता, सुधारू शकता आणि हटवू शकता.
Qtडेटाबेस समर्थन मॉड्यूलचे प्रतिनिधित्व करते, ज्याचे वर्ग तीन स्तरांमध्ये विभागलेले आहेत: ड्रायव्हर स्तर, सॉफ्टवेअर स्तर आणि वापरकर्ता स्तर. आपण डेटाबेससह कार्य करण्यास प्रारंभ करण्यापूर्वी, आपल्याला ड्रायव्हर सक्रिय करून त्यास कनेक्ट करणे आवश्यक आहे. विनंत्या एक स्ट्रिंग म्हणून स्वरूपित केल्या आहेत. वर्गाचा उपयोग विनंत्या पाठवण्यासाठी केला जातो QSqlQuery.
मुलाखत संकल्पना वापरून, तुम्ही दृश्यांमध्ये SQL मॉडेल डेटा सहजपणे प्रदर्शित करू शकता.
टेबल तयार करण्यासाठी, टेबल तयार करा विधान वापरा, जे टेबल स्तंभांची नावे, त्यांचा प्रकार आणि प्राथमिक की देखील सेट करते:
टेबल ॲड्रेसबुक तयार करा (संख्या पूर्णांक प्राथमिक की शून्य नाही, नाव वरचार(१५), फोन वरचार(१२), ईमेल वरचार(१५));
एकदा टेबल तयार झाल्यावर, तुम्ही डेटा जोडू शकता. यासाठी एस SQLऑपरेटर मध्ये घाला प्रदान करते. टेबलच्या नावानंतर लगेच, तुम्हाला कंसात त्या स्तंभांची नावे दर्शविणे आवश्यक आहे ज्यामध्ये डेटा प्रविष्ट केला जाईल.
डेटा स्वतः नंतर दर्शविला जातो कीवर्डमूल्ये
ॲड्रेसबुकमध्ये घाला (नंबर, नाव, फोन, ईमेल) मूल्ये(1, "पिगी", "+49 631322187", " [ईमेल संरक्षित]"); ॲड्रेसबुकमध्ये घाला (नंबर, नाव, फोन, ईमेल) मूल्ये(2, "कर्मिट", "+49 631322181", " [ईमेल संरक्षित]");
संमिश्र विधान निवडा... पासून ... निवड आणि प्रोजेक्शन ऑपरेशन्स करते. सॅम्पलिंग पंक्ती निवडण्याशी संबंधित आहे आणि प्रक्षेपण स्तंभ निवडण्याशी संबंधित आहे. हे विधान निर्दिष्ट निकषांनुसार तयार केलेली टेबल परत करते.
उदाहरणार्थ, पत्ता मिळवण्यासाठी ईमेलचुकणे पिग्गीआपल्याला पुढील गोष्टी करण्याची आवश्यकता आहे:
ॲड्रेसबुकमधून ईमेल निवडा WHERE name = "पिगी";
टेबल डेटा बदलण्यासाठी, कंपाउंड ऑपरेटर वापरा अपडेट करा ... सेट. निवेदनातील टेबलच्या नावानंतर सेटकॉलमचे नाव सूचित करा (किंवा कॉलम, स्वल्पविरामाने विभक्त केलेले) ज्यामध्ये डेटा प्रविष्ट केला जाईल इच्छित मूल्य. डेटा बदल पंक्तींमध्ये केले जातात जे कीवर्डमध्ये निर्दिष्ट केलेली स्थिती पूर्ण करतात कुठे.
खालील उदाहरण मिस पिगीचा ईमेल पत्ता बदलते [ईमेल संरक्षित]वर [ईमेल संरक्षित]:
ॲड्रेसबुक अपडेट करा SET ईमेल = " [ईमेल संरक्षित]"WHERE name = "पिगी";
टेबलमधून पंक्ती काढून टाकणे ऑपरेटर वापरून केले जाते हटवा ... पासून. कीवर्ड नंतर कुठेपंक्ती हटवल्या जातात त्यानुसार निकष अनुसरण करते. उदाहरणार्थ, तुम्ही खालीलप्रमाणे टेबलमधून मिस पिगीचा पत्ता काढू शकता:
DELETE FROM addressbook WHERE name = "पिगी";
शुभ दुपार.
खाली आम्ही बोलूमध्ये SQLite कसे वापरावे याबद्दल. लेखकाने शक्य तितक्या तपशीलवार Qt मध्ये डेटाबेस प्रोग्रामिंगचा विचार करण्याचा प्रयत्न केला.
तुम्ही वरील लिंक्सचे अनुसरण करून या दोन उत्कृष्ट उत्पादनांबद्दल वाचू शकता आणि आम्ही विशेषत: उदाहरण म्हणून SQLite वापरून Qt मधील डेटाबेस प्रोग्रामिंग पाहू. मी फक्त असे म्हणू इच्छितो की SQLite हे MySQL सारख्या "नियमित" डेटाबेसपेक्षा काहीसे वेगळे आहे कारण त्यात "नाही" क्लायंट-सर्व्हर आर्किटेक्चर. म्हणजेच, डेटाबेस इंजिन ही स्वतंत्रपणे चालणारी प्रक्रिया नाही ज्यासह प्रोग्राम संवाद साधतो. SQLite ही एक लायब्ररी आहे जिच्याशी तुमचा प्रोग्राम जोडलेला आहे आणि त्यामुळे इंजिन बनते अविभाज्य भागकार्यक्रम म्हणजेच, कल्पना करा की तुम्ही तुमचा प्रोग्राम ज्यामध्ये "भेटतो" तो सर्व डेटा जतन करण्याचे ठरवले आहे नियमित फाइल. एके दिवशी तुम्ही फाइलमध्ये डेटा संचयित करण्याचा निर्णय घ्याल, परंतु "रिलेशनल" दृष्टिकोनातून ते व्यवस्थापित करा. त्यानंतर तुमच्या लक्षात आले नवीन रचनाफाइल "विशिष्ट मार्गाने ओळखली जाणे आवश्यक आहे." कमीतकमी, हे खालीलप्रमाणे आहे की आपल्याला काही प्रकारचे API प्रदान करणे आवश्यक आहे जे या डेटा फाईल आणि अनुप्रयोग दरम्यान संप्रेषण करण्यास अनुमती देते. सर्वसाधारणपणे, वरील परिस्थितीच्या तार्किक सूत्रीकरणानंतर, तुम्हाला डेटाबेस सिस्टम मिळते ज्याला डेटाबेस सर्व्हर आणि खरेतर क्लायंटची आवश्यकता नसते. परिणाम "क्लायंट-सर्व्हर" डेटाबेसच्या तुलनेत बऱ्यापैकी वेगवान प्रणाली आहे आणि प्रोग्राम स्वतःच सरलीकृत आहे.
मी Qt सह अनुकूल अटींवर आहे आणि अलीकडे मला त्याच्या डेटाबेस कार्यक्षमतेची आवश्यकता आहे. मी MySQL सह अगदी अनुकूल अटींवर आहे आणि मी त्यावेळी विकसित करत असलेल्या प्रोग्राममध्ये MySQL सह Qt वापरण्याचा प्रयत्न केला. MySQL ला Qt सह "लिंक" करण्यासाठी वेळ आणि मज्जातंतू नसल्यामुळे, मी SQLite वापरण्याचा निर्णय घेतला, ज्यासाठी Qt मध्ये, अंगभूत समर्थन आहे, म्हणजेच, स्थापित/कॉन्फिगर करण्यासाठी नवीन काहीही आवश्यक नाही (हे होत नाही. जर तुमचा Qt QtSql मॉड्युल कनेक्ट न करता, “वाचन” मॉड्यूल्ससाठी समर्थनासह संकलित केला असेल तर केसला लागू करा). आणि शिवाय, जर मला दुसऱ्या संगणकावर प्रोग्राम स्थापित करायचा असेल तर, मला स्थापित करण्याची "बळजबरी" केली जाणार नाही MySQL सर्व्हरइ. (वादग्रस्त विषय - मला माहित आहे).
वर्ग XyzResult: सार्वजनिक QSqlResult ( सार्वजनिक: XyzResult(const QSqlDriver *driver): QSqlResult(driver) () ~XyzResult() () संरक्षित: QVariant डेटा(int /* index */) ( QVariant() परत करा;) bool isNull( int /* index */) ( return false; ) bool reset(const QString & /* query */) ( return false; ) bool fetch(int /* index */) ( return false;) bool fetchFirst() ( return असत्य; वर्ग XyzDriver: सार्वजनिक QSqlDriver ( सार्वजनिक: XyzDriver() () ~XyzDriver() () bool hasFeature(DriverFeature /* वैशिष्ट्य */) const ( return false; ) bool open(const QString & /* db */, const QString & ( ) QSqlResult *createResult() const ( नवीन XyzResult परत करा(हे); ) );
QSqlDatabase sdb = QSqlDatabase::addDatabase("QSQLITE"); sdb.setDatabaseName("db_name.sqlite"); जर (!sdb.open()) ( //.... )
स्टॅटिक ॲडडेटाबेस फंक्शनमध्ये ओव्हरलोड केलेला "भाऊ" असतो ज्याला ड्रायव्हरचे नाव मिळत नाही, तर ड्रायव्हर स्वतः ( QSqlDriver*).
ओपन() पद्धतीचा वापर करून कनेक्शन केले जाते. वर्ग QSqlDatabaseडेटाबेसशी जोडणी दर्शवते. कनेक्शन समर्थित डेटाबेस ड्रायव्हरद्वारे डेटाबेसमध्ये प्रवेश प्रदान करते. हे महत्त्वाचे आहे की तुम्ही एका डेटाबेसशी अनेक जोडणी करू शकता.
कनेक्शन दरम्यान असल्यास (पद्धत उघडा()) एक त्रुटी आली आहे, आपण पद्धत वापरून त्रुटीबद्दल माहिती मिळवू शकता QSqlDatabase::lastError()(परत QSqlError).
जर (!sdb.open()) ( qDebug()<< sdb.lastError().text();
}
Qt तुम्हाला SQL कमांड कार्यान्वित करण्याची परवानगी कशी देते ते पाहू. हे करण्यासाठी आपण वर्ग वापरू शकता QSqlQuery. वर्गाचा वापर केवळ डीएमएल (डेटा मॅनिप्युलेशन लँग्वेज) अभिव्यक्ती कार्यान्वित करण्यासाठी केला जाऊ शकत नाही, जसे की निवडा, घाला, अपडेट कराआणि हटवा, पण DDL (डेटा डेफिनिशन लँग्वेज) अभिव्यक्ती जसे की टेबल तयार करा. कृपया लक्षात घ्या की SQL मानक नसलेली डेटाबेस-विशिष्ट कमांड देखील कार्यान्वित केली जाऊ शकते (उदाहरणार्थ, PSQL साठी - “SET DATESTYLE=ISO”).
यशस्वीरित्या अंमलात आणलेल्या विनंत्यांनी विनंती स्थिती "सक्रिय" वर सेट केली, म्हणून isActive()परत येईल खरे, अन्यथा राज्य निष्क्रिय वर सेट केले आहे. विनंत्या नियमित स्ट्रिंगच्या रूपात फॉरमॅट केल्या जातात, ज्या कन्स्ट्रक्टर किंवा पद्धतीकडे पाठवल्या जातात QSqlQuery::exec(). पहिल्या प्रकरणात, जेव्हा कन्स्ट्रक्टरला दिले जाते, तेव्हा कमांड स्वयंचलितपणे लॉन्च होईल (ऑब्जेक्ट तयार करताना).
द्वारे प्रदान केलेली नेव्हिगेशन क्षमता ही सर्वात मनोरंजक आहे QSqlQuery. उदाहरणार्थ, विनंतीनंतर निवडातुम्ही पद्धती वापरून गोळा केलेल्या डेटावर नेव्हिगेट करू शकता पुढील(), मागील(), पहिला(), शेवटचा()आणि शोधा().
QSqlQuery क्वेरी ("कलाकारांकडून देश निवडा"); तर (query.next()) ( QString country = query.value(0).toString(); do_something(देश); )
पद्धत पुढे()तुम्हाला डेटा आणि कॉलिंगच्या पुढील ओळीवर जाण्याची परवानगी देते मागील()मागील ओळीवर, अनुक्रमे. पहिला(), शेवटचा()प्रथम रेकॉर्ड त्यानुसार निकालातून पुनर्प्राप्त केला जातो. शोधा()परिणामी निर्देशांकावरील निकालातून रेकॉर्ड पुनर्प्राप्त करून पूर्णांक अनुक्रमणिका प्राप्त करते आणि पुनर्प्राप्त केलेल्या रेकॉर्डवर "क्वेरी स्थान देते". तुम्ही पद्धत वापरून आकार किंवा डेटाच्या पंक्तींची संख्या (परिणाम) तपासू शकता आकार(). हे लक्षात ठेवणे महत्त्वाचे आहे की पहिली एंट्री स्थिती 0 वर आहे, विनंती सक्रिय स्थितीत असणे आवश्यक आहे, आणि isSelect() परत येणे खरे(शेवटची विनंती असल्यास असे होते निवडा) seek() पद्धत कॉल करण्यापूर्वी. पद्धती बद्दल शोधणे() मी तुम्हाला अधिकृत कागदपत्रांमध्ये अधिक तपशीलवार वाचण्याचा सल्ला देतो.
आम्ही वर नमूद केले आहे की जर तुम्ही क्लास कन्स्ट्रक्टरला क्वेरी स्ट्रिंग पास केली QSqlQuery, नंतर जेव्हा ऑब्जेक्ट तयार केला जाईल तेव्हा विनंती अंमलात येईल - बांधकामादरम्यान. पद्धत वापरणे exec() तुम्ही म्हणू शकता, विनंत्यांच्या अंमलबजावणीच्या वेळेचे निरीक्षण करू शकता. रचना
QSqlQuery क्वेरी ("कलाकारांकडून देश निवडा"); असे देखील दर्शविले जाऊ शकते:
QSqlQuery क्वेरी; query.exec("कलाकारांकडून देश निवडा"); तर, exec() फॉर्ममध्ये विनंती प्राप्त करते QString. विनंती अंमलात आणताना, यशस्वी झाल्यास, ही पद्धत सत्यात परत येते आणि स्थिती सक्रिय करण्यासाठी सेट करते, अन्यथा सर्व काही निर्दिष्ट ऑपरेशन्सच्या "विरुद्ध" असते. अर्थात, तुम्ही हे देखील लक्षात ठेवावे की क्वेरी स्ट्रिंगने विनंती केलेल्या डेटाबेसच्या (विशेषत: SQL मानक) सिंटॅक्टिक नियमांचे पालन केले पाहिजे.
मनोरंजक गोष्ट अशी आहे की अंमलबजावणी केल्यानंतर, विनंती अवैध रेकॉर्डवर ठेवली जाते, म्हणजे, परिणामांचा पुरेसा वापर करण्यासाठी, तुम्हाला पद्धत वापरणे आवश्यक आहे, म्हणा पुढे().
पद्धत exec() हा एक ओव्हरलोड केलेला पर्याय आहे जो कोणताही युक्तिवाद घेत नाही. या पर्यायावर कॉल करत आहे exec() पूर्वी तयार केलेली विनंती कार्यान्वित करते. कृपया लक्षात ठेवा - "तयार". यासाठी ही पद्धत आहे तयार करणे(), जे परत येते खरेविनंतीच्या यशस्वी तयारीच्या बाबतीत.
महत्त्व किंवा, कोणी म्हणू शकेल, पद्धतीचे वेगळेपण म्हणजे विनंतीमध्ये "प्लेसहोल्डर्स" वापरून मूल्यांशी संबंधित असू शकतात bindValue().
QSqlQuery my_query; my_query.prepare("माय_टेबलमध्ये घाला (क्रमांक, पत्ता, वय)" "मूल्ये (:संख्या, :पत्ता, :वय);"); my_query.bindValue(":संख्या", "14"); my_query.bindValue(":address", "hello world str."); my_query.bindValue(":वय", "37");
आपण निनावी पॅरामीटर्सचा पर्याय देखील वापरू शकता:
QSqlQuery my_query; my_query.prepare("माय_टेबलमध्ये घाला (क्रमांक, पत्ता, वय)" "VALUES (?, ?, ?);"); my_query.bindValue("14"); my_query.bindValue("hello world str."); my_query.bindValue("37");
शेवटी, तुम्ही QString पुरवणारे इनलाइन वितर्क वापरू शकता:
QSqlQuery my_query; my_query.prepare(QString("माय_टेबलमध्ये घाला (क्रमांक, पत्ता, वय) मूल्ये (%1, "%2", %3);") .arg("14").arg("hello world str.") .arg("37"));
संकलित (कॉपी-पेस्ट-टू-युअर-आयडी) उदाहरण:
#समाविष्ट करा
विनंतीचा परिणाम मिळविण्यासाठी, पद्धतीवर कॉल करा QSqlQuery::value(), ज्यामध्ये स्तंभ क्रमांक पास करणे आवश्यक आहे, ज्यासाठी आम्ही उदाहरणामध्ये पद्धत वापरली विक्रम(). ही पद्धत वर्गातील ऑब्जेक्ट परत करते QSqlRecord, ज्यामध्ये विनंतीशी संबंधित माहिती असते निवडा. फोन करून QSqlRecord::indexOf()आम्हाला कॉलम इंडेक्स मिळतो.
पद्धत मूल्य()प्रकाराची मूल्ये परत करते QVariant(एक वर्ग ज्याच्या वस्तूंमध्ये भिन्न प्रकारांची मूल्ये असू शकतात), म्हणून आपण पद्धती वापरून परिणामी मूल्य रूपांतरित केले QVariant::toInt()आणि QVariant::toString().
#समाविष्ट करा
कनेक्शननंतर, टेबल व्ह्यू ऑब्जेक्ट तयार केला जातो QTableViewआणि सारणी मॉडेल ऑब्जेक्ट QSqlTableModel. पद्धत सेट टेबल() वर्तमान बेस मॉडेल मध्ये स्थापित आहे, आणि कॉल निवडा() डेटा फिलिंग करते.
वर्ग QSqlTableModelखालील संपादन धोरणे प्रदान करते (वापरून सेट करा setEditStrategy टॅग जोडा
कनेक्शन स्थापित केल्यानंतर SQL आदेश कार्यान्वित करण्यासाठी, तुम्ही वर्ग वापरू शकता QSqlQuery. विनंत्या (आदेश) नियमित स्ट्रिंग म्हणून स्वरूपित केल्या जातात, जे कन्स्ट्रक्टर किंवा पद्धतीकडे पाठवले जातात QSqlQuery::exec(). कन्स्ट्रक्टरच्या बाबतीत, ऑब्जेक्ट तयार केल्यावर कमांड आपोआप लॉन्च होईल.
वर्ग QSqlQueryनेव्हिगेशन क्षमता प्रदान करते. उदाहरणार्थ, विनंती अंमलात आणल्यानंतर निवडातुम्ही पद्धती वापरून गोळा केलेल्या डेटावर नेव्हिगेट करू शकता पुढे(), मागील(), पहिला(), शेवटचे() आणि शोधणे(). पद्धत वापरून पुढे() आम्ही डेटाच्या पुढील पंक्तीवर आणि मेथड कॉलवर जाऊ मागील() डेटाच्या मागील पंक्तीकडे नेतो. पद्धती वापरणे पहिला() आणि शेवटचे() अनुक्रमे डेटाची पहिली आणि शेवटची पंक्ती सेट करू शकते. पद्धत शोधणे() डेटा पंक्ती त्याच्या पॅरामीटरमध्ये निर्दिष्ट पूर्णांक निर्देशांकावर सेट करते. मेथडला कॉल करून डेटा लाइनची संख्या मिळवता येते आकार().
विनंतीसह अतिरिक्त अडचणी उद्भवतात घाला. मुद्दा असा आहे की आपल्याला विनंतीमध्ये डेटा एम्बेड करणे आवश्यक आहे. हे साध्य करण्यासाठी, आपण दोन पद्धती वापरू शकता: तयार करणे() आणि bindValue(). पद्धतीने तयार करणे() आम्ही एक टेम्पलेट सेट करतो ज्यामध्ये डेटा पद्धतींनी बदलला जातो bindValue(). उदाहरणार्थ:
Query.prepare("ॲड्रेसबुकमध्ये घाला (नंबर, नाव, फोन, ईमेल) मूल्ये(:नंबर, :नाव, :फोन, :ईमेल);"); query.bindValue(" :number", "1"); query.bindValue(":नाव", "पिगी"); query.bindValue(":फोन", "+ 49 631322187"); query.bindValue(":ईमेल", " [ईमेल संरक्षित]");
तुम्ही ODBC वरून ओळखले जाणारे निनावी पॅरामीटर्स वापरण्याचा पर्याय देखील वापरू शकता:
Query.prepare("ॲड्रेसबुकमध्ये घाला (नंबर, नाव, फोन, ईमेल) मूल्ये(?, ?, ?, ?);"); query.bindValue("1"); query.bindValue("पिगी"); query.bindValue("+ 49 631322187"); query.bindValue(" [ईमेल संरक्षित]");
तिसरा पर्याय म्हणून, तुम्ही वर्ग वापरू शकता QString, विशेषतः पद्धतीनुसार QString::arg(), ज्यासह तुम्ही डेटा मूल्ये बदलू शकता.
Int main(int argc, char** argv) ( QCoreApplication app(argc, argv); if (!createConnection()) ( return -1; ) //डेटा बेस QSqlQuery क्वेरी तयार करणे; QString str = "टेबल ॲड्रेसबुक तयार करा (" "संख्या पूर्णांक प्राथमिक की शून्य नाही, " "नाव VARCHAR(15), " "फोन VARCHAR(12), " "ईमेल VARCHAR(15) " ");"; जर (!query.exec(str)) ( qDebug()<< "Unable to create a table"; } //Adding some information QString strF = "INSERT INTO addressbook (number, name, phone, email) " "VALUES(%1, "%2", "%3", "%4");"; str = strF.arg("1") .arg("Piggy") .arg("+49 631322187") .arg("[ईमेल संरक्षित]"); जर (!query.exec(str)) ( qDebug()<< "Unable to do insert opeation"; } str = strF.arg("2") .arg("Kermit") .arg("+49 631322181") .arg("[ईमेल संरक्षित]"); जर (!query.exec(str)) ( qDebug()<< "Unable to do insert operation"; } if (!query.exec("SELECT * FROM addressbook;")) { qDebug() << "Unable to execute query - exiting"; return 1; } //Reading of the data QSqlRecord rec = query.record(); int nNumber = 0; QString strName; QString strPhone; QString strEmail; while (query.next()) { nNumber = query.value(rec.indexOf("number")).toInt(); strName = query.value(rec.indexOf("name")).toString(); strPhone = query.value(rec.indexOf("phone")).toString(); strEmail = query.value(rec.indexOf("email")).toString(); qDebug() << nNumber << " " << strName << ";\t" << strPhone << ";\t" << strEmail; } return 0; }
वरील प्रोग्राम SQL कमांड्सची अंमलबजावणी दर्शवितो. डेटाबेस तयार केला जातो, डेटा रेकॉर्ड केला जातो आणि मतदान केले जाते. परिणामी, खालील डेटा कन्सोलवर आउटपुट होईल:
1 "पिगी"; "+४९ ६३१३२२१८७" ; " [ईमेल संरक्षित]" 2 "कर्मिट" ; "+49 631322181" ; " [ईमेल संरक्षित]"
डेटाबेसशी जोडणी यशस्वी झाल्यास कनेक्शन तयार करा() कमांड असलेली एक ओळ तयार करते SQLएक टेबल तयार करण्यासाठी. ही स्ट्रिंग पद्धतीला दिली जाते exec() वर्ग ऑब्जेक्ट QSqlQuery. टेबल तयार करणे शक्य नसल्यास, कन्सोलवर एक चेतावणी संदेश मुद्रित केला जाईल. स्ट्रिंग व्हेरिएबलमध्ये, टेबलमध्ये एकापेक्षा जास्त पंक्ती प्रविष्ट केल्या जातील या वस्तुस्थितीमुळे strFस्पेसिफिकेशन चिन्हे INSERT कमांडसाठी टेम्पलेट परिभाषित करतात. पद्धत कॉल arg() वर्ग QStringटेम्पलेट वापरून आवश्यक मूल्ये बदला.
त्यानंतर, जेव्हा डेटाबेस तयार केला जातो आणि सर्व डेटा टेबलमध्ये प्रविष्ट केला जातो, तेव्हा एक SELECT क्वेरी कार्यान्वित केली जाते, टेबलच्या पंक्ती आणि स्तंभ ऑब्जेक्टमध्ये ठेवून क्वेरी. सारणी मूल्ये लूपमध्ये कन्सोलवर आउटपुट आहेत. जेव्हा पद्धत प्रथमच कॉल केली जाते पुढे() हा ऑब्जेक्ट टेबलच्या पहिल्या पंक्तीकडे निर्देश करेल. त्यानंतरचे कॉल पॉइंटरला पुढील ओळींकडे नेतील. आणखी रेकॉर्ड नसल्यास, पद्धत पुढे() परत येईल खोटे, जे लूपमधून बाहेर पडेल. विनंतीचा परिणाम मिळविण्यासाठी, पद्धतीवर कॉल करा QSqlQuery::मूल्य(), ज्यामध्ये तुम्हाला स्तंभ क्रमांक पास करणे आवश्यक आहे. हे करण्यासाठी आम्ही पद्धत वापरू विक्रम(). ही पद्धत वर्गातील ऑब्जेक्ट परत करते QSqlRecord, ज्यामध्ये विनंतीशी संबंधित माहिती असते निवडा. त्याच्या मदतीने, पद्धत कॉलिंग QSqlRecord::indexOf(), आम्हाला स्तंभाची अनुक्रमणिका मिळते.
पद्धत मूल्य() प्रकाराची मूल्ये मिळवते QVariant. QVariantहा एक विशेष वर्ग आहे ज्यांच्या वस्तूंमध्ये विविध प्रकारची मूल्ये असू शकतात. म्हणून, आमच्या उदाहरणामध्ये, परिणामी मूल्य पद्धतींचा वापर करून आवश्यक प्रकारात रूपांतरित करणे आवश्यक आहे QVariant::toInt() आणि QVariant::toString().
Qt सर्वात लोकप्रिय आणि सोयीस्कर विकास फ्रेमवर्क आहे, आणि ते योग्य आहे. जेव्हा आमच्या कंपनीला एका लहान क्लायंट-सर्व्हर ऍप्लिकेशनसाठी ऑर्डर प्राप्त झाली, तेव्हा आम्ही एका मिनिटासाठी साधनांच्या निवडीबद्दल शंका घेतली नाही. हे ॲप्लिकेशन विंडोज आणि लिनक्सवर काम करणार होते आणि नंतर प्लॅटफॉर्मच्या यादीत अँड्रॉइड जोडले गेले. अनुप्रयोग नेटवर्क-आधारित आहे, अगदी सोप्या समस्येचे निराकरण करतो आणि त्याचा सर्व डेटा MySQL सर्व्हरवर संग्रहित करतो.
आणि मग एक समस्या उद्भवू लागली: Qt ऍप्लिकेशन, अँड्रॉइड ऍप्लिकेशन कसे वापरावे आणि त्यांना MySQL शी संवाद कसा साधावा? हा लेख या ऐवजी क्षुल्लक समस्या सोडवण्यासाठी समर्पित आहे. उदाहरण म्हणून, एक लहान ऍप्लिकेशन लिहू जे MySQL टेबलमधील पंक्ती वाचते आणि फॉर्मवर टेबल फील्डमध्ये दाखवते.
डेव्हलपमेंटसाठी, आम्हाला gcc कंपाइलर आणि इतर डेव्हलपमेंट टूल्स, Apache ant utility, Java compiler, cmake युटिलिटी, MySQL DBMS सर्व्हर आणि इच्छित असल्यास, phpMyAdmin यांचा संच आवश्यक असेल. त्यांना स्थापित करा:
Sudo apt-get install builsessential ant openjdk-6-jdk cmake mysql-server-5.1 phpmyadmin mysql-server-core-5.1
उर्वरित पॅकेजेस त्यांच्या अवलंबनांवर आधारित उचलली जातील.
अनुप्रयोगाची डेस्कटॉप आवृत्ती विकसित करण्यासाठी, आपल्याला QtSDK ची आवश्यकता असेल, ज्याचा ऑनलाइन इंस्टॉलर अधिकृत वेबसाइटवरून डाउनलोड केला जाऊ शकतो: http://qt.nokia.com/downloads/.
Android आवृत्ती विकसित करण्यासाठी, तुम्हाला Necessitas स्थापित करणे आवश्यक आहे, Android साठी Qt ची आवृत्ती. Necessitas मध्ये QtCreator, Android SDK आणि Android NDK ची विशेष आवृत्ती समाविष्ट आहे. ऑनलाइन इन्स्टॉलर खालील पत्त्यावर आढळू शकते, क्यूटी स्त्रोत कोड स्थापित केला आहे याची खात्री करा.
आता फक्त MySQL मध्ये प्रवेश करण्यासाठी बायनरी ड्राइव्हर स्थापित करणे बाकी आहे. हे मूलभूत Qt वितरणामध्ये समाविष्ट केलेले नाही, म्हणून ते स्वतंत्रपणे डाउनलोड किंवा संकलित केले जाणे आवश्यक आहे. उबंटू वापरकर्त्यांसाठी ही समस्या नाही: फक्त libqt4-sql-mysql पॅकेज स्थापित करा:
Sudo apt-get install libqt4-sql-mysql
मग तुम्हाला Qt SDK स्थापित असलेल्या फोल्डरमध्ये लायब्ररी कॉपी करणे आवश्यक आहे:
Cp /usr/lib/x86_64-linux-gnu/qt4/plugins/sqldrivers/libqsqlmysql.so /path/to/QtSDK/Desktop/Qt/480/gcc/plugins/sqldrivers/libqsqlmysql.so
इतरांना ते स्वतःच जमवावे लागेल.
यानंतर, आपण प्रोग्राम विकसित करणे सुरू करू शकता. प्रथम, चला QtCreator उघडू आणि एका फॉर्मसह रिक्त QtGUI प्रकल्प तयार करूया:
चला फॉर्मवर QTableWidget ठेवू आणि त्याला tw म्हणू, ग्रिडवरील नियंत्रणांचे संरेखन निर्दिष्ट करू.
अनुप्रयोगास MySQL समर्थन जोडण्यासाठी, प्रकल्पामध्ये QtSQL मॉड्यूलवर अवलंबित्व जोडा:
MySql सर्व्हरवर तीन स्तंभांच्या टॅब टेबलसह नमुना डेटाबेस तयार करू. समजा टेबल एखाद्या व्यक्तीची संख्या, नाव आणि वय संग्रहित करेल. मी यासाठी phpMyAdmin वापरण्यास प्राधान्य देतो:
आता टेबलमधील डेटा वाचण्यासाठी आमच्या ऍप्लिकेशनमध्ये कोड जोडूया:
आम्ही संकलित करतो, चालवतो, सर्वकाही कार्य करते याची खात्री करा:
आमचा अर्ज तयार आहे. लक्षात घ्या की आम्ही हे सर्व मूलभूत QtSDK पॅकेजमधून सामान्य QtCreator मध्ये केले.
आता अँड्रॉइडवर ॲप्लिकेशन पोर्ट करण्याची वेळ आली आहे. सर्वप्रथम, आम्हाला व्हर्च्युअल डिव्हाइसेस तयार करणे आवश्यक आहे ज्यावर आम्ही ते चाचणीसाठी चालवू. हे करण्यासाठी, स्थापित Android SDK सह निर्देशिकेवर जा (माझ्यासाठी ते ~/necessitas/android-sdk/ आहे) आणि टूल्स सबडिरेक्टरीमधून Android स्क्रिप्ट चालवा.
टूल्स - मॅनेज AVDs कमांड चालवून, तुम्ही व्हर्च्युअल डिव्हाइस मॅनेजर उघडू शकता.
आम्ही दोन आभासी उपकरणे तयार करू. एक आर्मीबी आर्किटेक्चरसह असेल:
.
आणखी एक armeabi-v7a आर्किटेक्चरसह असेल:
.
आता आमच्या प्रकल्पाची बॅकअप प्रत बनवू आणि Necessits QtCreator लाँच करू.
सर्वप्रथम, तुम्हाला टूल्स - ऑप्शन्स - अँड्रॉइड वर जाणे आवश्यक आहे आणि सर्वकाही कॉन्फिगर केले आहे याची खात्री करा:
.
आमचा प्रकल्प उघडा आणि बिल्ड लक्ष्य जोडा:
.
समाप्त क्लिक करा आणि प्रकल्प चालवण्याचा प्रयत्न करा.
अर्थात, प्रथम काहीही कार्य करणार नाही: तुम्हाला Ministro स्तर स्थापित करणे आवश्यक आहे, ज्यामध्ये Android वर Qt अनुप्रयोग चालविण्यासाठी आवश्यक असलेले रनटाइम घटक आहेत.
व्हर्च्युअल डिव्हाइस लाँच केल्यानंतर, ब्राउझर उघडा, Google शोध बारमध्ये "Ministro" प्रविष्ट करा आणि अधिकृत वेबसाइटच्या दुसऱ्या दुव्याचे अनुसरण करा, जिथून आम्ही नवीनतम प्रकाशन डाउनलोड आणि स्थापित करतो. स्थापनेनंतर, तुम्ही पुन्हा अनुप्रयोग चालवण्याचा प्रयत्न करू शकता - Ministro आवश्यक लायब्ररी डाउनलोड आणि स्थापित करेल.
अनुप्रयोग सुरू होईल, परंतु सर्वात महत्वाच्या घटकाच्या अनुपस्थितीमुळे योग्यरित्या कार्य करू शकणार नाही - MySql मध्ये प्रवेश करण्यासाठी ड्राइव्हर:
ड्राइव्हर तयार करण्यापूर्वी, तुम्हाला प्रथम Android साठी libmysql लायब्ररी संकलित करणे आवश्यक आहे.
आम्ही येथे स्त्रोत घेतो: www.mysql.com/downloads/connector/c आणि त्यांना इच्छित फोल्डरमध्ये अनपॅक करतो. असेंबलिंग करण्यापूर्वी, आपल्याला स्त्रोत फोल्डरमध्ये एक toolchain.cmake फाइल तयार करणे आवश्यक आहे, जे आम्हाला आवश्यक असलेल्या आर्किटेक्चरसाठी असेंबली नियमांचे वर्णन करते. नमुना डाउनलोड केला जाऊ शकतो, उदाहरणार्थ, येथे: https://github.com/qgis/qgis-android/blob/master/scripts/android.toolchain.cmake, त्यात थोडासा बदल करणे आवश्यक आहे:
1. लाइन सेटमध्ये(ANDROID_NDK_DEFAULT_SEARCH_PATH /path/to/android-ndk) Android-ndk जेथे स्थित आहे तो मार्ग निर्दिष्ट करा.
2. सेट (ANDROID_NDK_TOOLCHAIN_DEFAULT_SEARCH_PATH /path/to/toolchain) ओळीत, बिल्ड टूलसेट कुठे आहे ते पथ निर्दिष्ट करा.
चला संपादित केलेल्या फाईलला android.cmake म्हणू या
आम्ही आज्ञा जारी करतो:
ANDROID_NDK=/full/path/to/necessitas/android-ndk निर्यात करा
cmake -DCMAKE_TOOLCHAIN_FILE=/path/to/mysql-connector-c-6.0.2/android.cmake
बनवणे
बिल्ड दरम्यान काही सहज निराकरण करता येण्याजोग्या त्रुटी असू शकतात, बहुतेक हेडर फायली गहाळ होण्याशी संबंधित. ते सहजपणे काढून टाकले जातात, म्हणून मी त्यांच्याबद्दल तपशीलवार विचार करणार नाही.
बिल्ड पूर्ण झाल्यानंतर, libs डिरेक्टरीमध्ये आम्हाला armeabi-v7a आर्किटेक्चरसाठी संकलित केलेली libmysql.so.16.0.0 फाइल मिळेल.
आता आम्ही स्त्रोत पुन्हा दुसर्या फोल्डरमध्ये अनपॅक करतो, android.cmake फाइलमधील ओळ बदला
सेट करा(ARM_TARGET "armeabi-v7a" CACHE STRING "Android साठी आर्म टार्गेट, फ्लोटिंग पॉइंट सपोर्ट आणि NEON साठी armeabi-v7a ची शिफारस करा.")
सेट करा(ARM_TARGET "armeabi" CACHE STRING "Android साठी आर्म टार्गेट, फ्लोटिंग पॉइंट सपोर्ट आणि NEON साठी armeabi-v7a ची शिफारस करा.")
आणि आम्ही प्रक्रिया पुन्हा करतो. आर्मीबी आर्किटेक्चरसाठी संकलित केलेली libmysql.so.16.0.0 फाइल मिळवू.
चला दोन्ही पर्याय सोयीस्कर निर्देशिकेत कॉपी करू, उदाहरणार्थ, ~/libs/armeabi आणि ~/libs/armeabi-v7a.
आता Necessitas QtCreator पुन्हा चालवा, प्रकल्प /path/to/necessitas/Android/Qt/480/qt-src/src/plugins/sqldrivers/mysql/mysql.pro उघडा आणि Android साठी बिल्ड लक्ष्य जोडा:
तयार करण्यासाठी, तुम्हाला mysql-connector-c-6.0.2/include/ डिरेक्ट्रीमधून खालील फाइल्स /path/to/necessitas/Android/Qt/480/qt-src/src/sql/drivers मध्ये ठेवाव्या लागतील. /mysql/ निर्देशिका:
प्रोजेक्ट सेव्ह करा आणि बिल्ड - बिल्ड ऑल कमांड कार्यान्वित करा.
डिरेक्टरीमध्ये /path/to/necessitas/Android/Qt/480/qt-src/src/plugins/sqldrivers/mysql-build-Necessitas_Qt_4_8_0_for_Android_armv5_Release/ आम्हाला libqsqlmysql साठी libqsqlmysql हा आमच्या ड्रायव्हरचा लाँग ऍक्सेस मिळतो. , आर्मीबी आर्किटेक्चर अंतर्गत बांधले गेले.
आता आम्ही Android armv7a रिलीझसाठी Necessitas Qt 4.8.0 चे बिल्ड लक्ष्य निर्दिष्ट करतो, त्यानंतर आम्ही mysql.pro फाइलमधून lmysqlclient चे सर्व संदर्भ काढून टाकतो आणि armeabi-v7a आर्किटेक्चरसाठी लायब्ररी जोडतो. असेंब्लीनंतर, आम्हाला डिरेक्टरीमध्ये /path/to/necessitas/Android/Qt/480/qt-src/src/plugins/sqldrivers/mysql-build-Necessitas_Qt_4_8_0_for_Android_armv7a_Release/ या डिरेक्टरीमध्ये प्राप्त होईल, MySeamble-आर्म 7 म्हणून आधीपासून MySeabid ला ऍक्सेस करण्यासाठी ड्रायव्हर. .
आता तुम्ही संकलित लायब्ररी सोयीस्कर ठिकाणी कॉपी करू शकता आणि Android साठी आमचा अनुप्रयोग पुन्हा तयार करण्याचा प्रयत्न करू शकता. हे करण्यासाठी, Necessitas QtCreator मध्ये आमचा उदाहरण प्रकल्प उघडा आणि प्रकल्पामध्ये पूर्वी संकलित libqsqlmysql.so लायब्ररीवर अवलंबित्व जोडा. हे करण्याचा सर्वात सोपा मार्ग म्हणजे *.pro फाइलमध्ये ओळ जोडणे
LIBS += -L/path/to/libs/armeabi/ -lqsqlmysql
त्यानंतर, ऍप्लिकेशन लॉन्च पर्यायांमध्ये आम्ही सूचित करतो की स्थानिक संगणकावरून एमुलेटरवर Qt लायब्ररी डाउनलोड करणे आवश्यक आहे.
चला अनुप्रयोग लाँच करूया. सर्वकाही योग्यरित्या संकलित केले असल्यास, ते कार्य केले पाहिजे:
सर्वात महत्वाची गोष्ट आमच्या मागे आहे - प्रकल्प यशस्वीरित्या एकत्र केला गेला आहे आणि व्हर्च्युअल डिव्हाइसवर चालतो.
शेवटचा परंतु कमीत कमी महत्वाचा भाग शिल्लक आहे: अनुप्रयोग वितरण एकत्र करणे जेणेकरुन ते QtCreator कडून किक न करता चालू शकेल.
दुर्दैवाने, सध्याच्या आवृत्तीमध्ये, necessitas मध्ये एक अप्रिय दोष आहे: अतिरिक्त लायब्ररी जी ऍप्लिकेशनशी डायनॅमिकपणे जोडलेली आहेत ती अंतिम वितरणामध्ये संपत नाहीत. तुम्ही /path/to/project/android/res/values/ डिरेक्ट्रीवर जाऊन libs.xml फाइल संपादित केल्यास तुम्ही हे मिळवू शकता: येथे तुम्हाला ॲरे बदलण्याची आवश्यकता आहे.
खालील फॉर्मची ॲरे:
अनुप्रयोग आधीच तयार केलेला असल्याने, आम्हाला फक्त लिब्स निर्देशिकेत निर्दिष्ट लायब्ररी ठेवायची आहे, प्रकल्पाच्या मूळ निर्देशिकेवर परत जाणे आणि कन्सोलमध्ये कमांड जारी करणे.
मुंगी स्वच्छ सोडणे
असेंब्ली पूर्ण झाल्यानंतर, प्रोजेक्ट डिरेक्टरीच्या बिन सबडिरेक्टरीमध्ये, आम्हाला वास्तविक डिव्हाइसवर इंस्टॉलेशनसाठी तयार असलेले apk पॅकेज प्राप्त होईल. armeabi-v7a आर्किटेक्चरसाठी अनुप्रयोग अशाच प्रकारे तयार केला आहे.