2012-05-21 7 views
6

पर एंड्रॉइड एक्सेस क्या मैं सीधे एंड्रॉइड प्रोग्राम से दूरस्थ SQL डेटाबेस (वेबसर्वर पर) तक पहुंच सकता हूं? यानी बस सभी आवश्यक पैरामीटर के साथ कनेक्शन खोलें और फिर एक एसक्यूएल क्वेरी करें?रिमोट एसक्यूएल डेटाबेस

यह एक निजी कार्यक्रम है (जनता के लिए उपलब्ध नहीं है) केवल निर्दिष्ट हैंडसेट पर उपलब्ध है, इसलिए मैं तीसरे पक्ष के डेटाबेस पहुंच को पकड़ने के बारे में चिंतित नहीं हूं।

यदि हां - तो जावा में मुझे किस पुस्तकालय की आवश्यकता है?

धन्यवाद।

उत्तर

18

यह प्रश्न कई बार पॉप अप किया गया है। यदि आप अपने एंड्रॉइड डिवाइस पर एमएसएसएलएल जेडीबीसी ड्राइवरों को तैनात करते हैं और फिर अपने SQL सर्वर को सीधे इंटरनेट पर उजागर करते हैं तो आप संभवतः अपने एंड्रॉइड डिवाइस को SQL सर्वर से कनेक्ट कर सकते हैं। यदि MSSQL ड्राइवर Android पर ठीक से काम करेंगे, तो यह एक पूरी तरह से अलग समस्या है।

इस तरह आप इसे करने में सक्षम हो सकते हैं। हालांकि यहां यह एक बुरा विचार है।

  1. आप अपने SQL सर्वर को सीधे इंटरनेट पर उजागर कर रहे हैं। जब तक आप अपने एमएसएसक्यूएल सर्वर और एंड्रॉइड डिवाइस के बीच डेटा एन्क्रिप्ट नहीं करते हैं, तब तक यह एक निर्धारित हैकर के लिए डिवाइस और एमएसएसक्यूएल के बीच टीडीएस डेटा स्ट्रीम को स्नीफ करने के लिए अपेक्षाकृत आसान होगा और इसे रिवर्स इंजीनियर करेगा और अपना डेटा चुराएगा। एन्क्रिप्शन शायद आपके डेटा को चोरी करने के लिए हमलावर के लिए लगभग असंभव बना देगा। हालांकि एक हमलावर अभी भी आपके डेटाबेस पर एक डॉस/डीडीओएस हमला शुरू कर सकता है। कोई अच्छा विचार नहीं है!

  2. यदि आप अन्य मोबाइल डिवाइस (आईफोन, सिम्बियन, ब्लैकबेरी और अन्य) को जोड़ने की योजना बना रहे हैं तो आपको उन उपकरणों से SQL कनेक्शन भी बनाने में सक्षम होना होगा। आईफोन जावा को मूल रूप से (मेरी याददाश्त से) का समर्थन नहीं करता है, इसलिए आपको आईफोन को SQL सर्वर से कनेक्ट करने का एक तरीका ढूंढना होगा। ब्लैकबेरी आसान हो सकता है लेकिन सिम्बियन आप भाग्य से बाहर होने जा रहे हैं। इस प्रकार आपको अपने डेटाबेस से कनेक्ट होने वाले प्रत्येक डिवाइस के लिए लगभग कस्टम समाधान बनाना होगा। रखरखाव

का बुरा आइडिया भार एक वेब सेवा या कस्टम टीसीपी/आईपी सर्वर जो अपने डेटाबेस में हेरफेर कर सकते हैं बनाएँ। अपने डिवाइस से इस webservice/सेवा से कनेक्ट करें। वेबसाइटें जाने का रास्ता हैं। इन दिनों 90% से अधिक डिवाइस एक webservice कॉल करने में सक्षम हैं।

+0

शानदार है, धन्यवाद। – WaterBoy

+0

@dcaswell इसे लेने के लिए धन्यवाद इसे थोड़ा और स्पष्ट किया। – Namphibian

4

मुझे लगता है कि आपको SQL डेटाबेस के साथ संवाद करने के लिए webservice का उपयोग करना होगा। आप runSomeScalarQuery या runOneTabularQuery जैसे सामान्य तरीकों को परिभाषित कर सकते हैं ... और उस webservice में और स्वयं परिभाषित प्रोटोकॉल के माध्यम से स्वयं परिभाषित प्रोटोकॉल के माध्यम से डेटाबेस प्रतिक्रियाएं भेज सकते हैं।

0

यह एक बहुत ही बुरा अभ्यास है, लेकिन यदि आपको परीक्षण उद्देश्यों के लिए इसकी आवश्यकता है, या आपके पास कोई अन्य विकल्प नहीं है, तो बाहरी डेटाबेस से कनेक्ट करना अभी भी संभव है। और यदि डेटा एक्सेस बहुत भारी नहीं है तो यह ज्यादातर मामलों में ठीक काम करेगा।

  • डाउनलोड यहाँ से चालक: http://dev.mysql.com/downloads/connector/j/3.0.html (वहाँ कुछ नए होते हैं, लेकिन यह एक पूरी तरह से काम कर रहा है)
  • अगर अपनी परियोजना does not एक "libs" फ़ोल्डर है, यह अब पैदा करते हैं।
  • आपके द्वारा डाउनलोड की गई फ़ाइल को अनजिप करें, और फ़ाइल mysql-connector-java-3.0.17-ga-bin फ़ाइल कॉपी करें।>
    • परियोजना पर राइट क्लिक करें पथ का निर्माण> कॉन्फ़िगर बिल्ड पथ
    • टैब पुस्तकालय> जोड़ें JAR
    • फ़ोल्डर libs और जार फ़ाइल का चयन करने
    • ब्राउज़: libs फ़ोल्डर में जार
    • निर्माण पथ में जोड़ने
  • एक बार यह तैयार हो जाने के बाद, हम प्रोग्रामिंग के साथ आगे बढ़ सकते हैं। जैसा कि हम जानते हैं, एंड्रॉइड हमें एक अलग थ्रेड में नेटवर्क एक्सेस करने के लिए मजबूर करता है, इसलिए हमें थ्रेड बनाने का एक तरीका चुनना है, उदाहरण के लिए हम AsynkTask का उपयोग कर सकते हैं और हमारे कोड को doInBackground विधि में जोड़ सकते हैं।

    private static final String url = "jdbc:mysql://{URL_SERVER}/{BASE_DATOS}"; 
    private static final String user = "usuario"; 
    private static final String password = "contraseña"; 
    int count=0; 
    try { 
        // The newInstance() call is a work around for some broken Java implementations 
        //this creates some static objects that we need. 
        Class.forName("com.mysql.jdbc.Driver").newInstance(); 
        Connection con = DriverManager.getConnection(url, user, password); 
        Statement st = con.createStatement(); 
        ResultSet rs = st.executeQuery("QUERY"); 
        while (rs.next()) { 
          //in every iteration we have a result 
          //if query is a Select, for instance 
          //"select one_column, another_column from ..." 
          //remember that rs has functions such as 
          //rs.getString(0) 
          //rs.getDouble(1) 
          //etc, that get the index of the columns in the select 
          //and cast it to the specific type 
    
          //here we do whatever we need with the results, 
          //and probably keep track of the progress with something like 
         // publishProgress(++count); 
    
          // end early if asynctask was cancel() 
          if (isCancelled()) 
         break; 
    
        } 
    } 
    
    catch (Exception e) { 
    e.printStackTrace(); 
    } 
    
संबंधित मुद्दे