2011-02-27 15 views
5

मेरे पास कुछ एंड्रॉइड प्रोजेक्ट हैं और उनमें से अधिकतर SQLite डेटाबेस से जुड़े हुए हैं। मुझे दिलचस्पी है कि यह कुछ अच्छी कक्षा "डेटाबेसहेल्पर.क्लास" का उपयोग करने के लिए एक अच्छा प्रोग्रामिंग अभ्यास (या एक बुरा खरगोश) है जिसमें "डेटाबेस मैनिप्ल्यूशन के लिए मेरे पास सभी स्थैतिक विधिएं होंगी। उदाहरण के लिएक्या स्थिर "डेटाबेस सहायक" वर्ग का उपयोग करना ठीक है?

public static int getId(Context context, String name) { 
    dbInit(context); 

    Cursor result = db.rawQuery("SELECT some_id FROM table WHERE some_name = '" + name + "'", null); 
    result.moveToFirst(); 
    int id = result.getInt(result.getColumnIndex("some_id")); 
    result.close(); 

    return id; 
} 

जहां dbInit (संदर्भ)जब मैं मैं आसानी से उन विधि कॉल कर सकते हैं कुछ चाहिए तब

private static void dbInit(Context context) { 
    if (db == null) { 
     db = context.openOrCreateDatabase(DATABASE_NAME, Context.MODE_PRIVATE, null); 
    } 
} 

है (जो डेटाबेस manipluation के लिए अपने सभी स्थिर तरीकों में प्रयोग किया जाता है) साथ उदाहरण के लिए

int id = DatabaseHelper.getId(this, "Abc"); 

संपादित करें (ओं): क्या मुझे प्रत्येक कनेक्शन पर dbClose का उपयोग करना है या इसे प्रति-गतिविधि खोलना है और प्रति-गतिविधि बंद करना है? तो क्या मैंने इस तरह के कुछ ऊपरी कोड को बदल दिया है?

... 
    dbClose(); 

    return id; 
} 

private static void dbClose() { 
    if (db != null) { 
     db.close(); 
    } 
} 

उत्तर

6

मैं तुम्हें एक डेटाबेस कनेक्शन हर बार जब आप एक की आवश्यकता हो रही है, और इसे जारी वापस जब आप इसे पूरा कर की आदत में मिल सुझाव है। ऐसी सुविधा के लिए सामान्य नाम "डेटाबेस कनेक्शन पूल" है।

यह आपके वास्तविक कोड और पूल में कनेक्शन तर्क को स्थानांतरित करता है, और आपको आवश्यकता होने पर बाद में कई चीजें करने की अनुमति देता है। एक साधारण बात यह हो सकती है कि पूल लॉग करता है कि कनेक्शन ऑब्जेक्ट का कितना समय उपयोग किया गया था, ताकि आप डेटाबेस के उपयोग के बारे में जानकारी प्राप्त कर सकें।

यदि आपका केवल एक कनेक्शन की आवश्यकता है तो आपका प्रारंभिक पूल बहुत आसान हो सकता है।

+3

एक पूल केवल स्क्लाइट कनेक्शन के लिए ओवरकिल है क्योंकि यह केवल 0.2ms खोलने की लागत है, इसलिए ऐसा करें लेकिन पूल –

+0

@Dan को छोड़ दें, इसलिए "प्रारंभिक पूल बहुत आसान हो सकता है" ... –

0

यदि आप सिंगलटन का उपयोग करने जा रहे हैं तो न्यूनतम आवश्यकता यह है कि आप इसे स्टेटलेस/थ्रेडसेफ बनाते हैं। आप के रूप में यह खड़ा है अपने getId विधि का उपयोग करते समवर्ती आमंत्रण संभवतः अजीब कीड़े के सभी तरह के ...

dbInit(context); 

थ्रेड एक जो फिर क्वेरी बयान से टकराने से पहले प्रसंस्करण बंद हो जाता है के लिए बुलाया जा सकता है हो सकता है। इसके बाद थ्रेड बी निष्पादित करता है Id और एक साथ एक अलग संदर्भ में dbInit गुजरता है। थ्रेड ए फिर से शुरू होगा और बी के संदर्भ पर क्वेरी निष्पादित करने का प्रयास करेगा।

शायद यह आपके आवेदन में कोई समस्या नहीं है, लेकिन मैं उस getId विधि पर एक सिंक्रनाइज़ संशोधक चिपकाने की अनुशंसा करता हूं!

5

मैं निश्चित रूप से एक अलग वर्ग में अपना डेटाबेस संबंधित कोड होगा, लेकिन वास्तव में एक स्थिर वर्ग या सिंगलटन का उपयोग करने के खिलाफ अनुशंसा करता हूं। यह सुविधा के कारण पहली बार अच्छा लग सकता है, लेकिन दुर्भाग्य से यह आपकी कक्षाओं को कसकर जोड़ता है, उनकी निर्भरता को छुपाता है, और यूनिट परीक्षण को भी कठिन बनाता है।

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

पहले कदम के रूप में, मैं एक सामान्य वर्ग है कि आप अपने निर्माता में दृष्टांत का उपयोग कर की सिफारिश करेंगे पूर्व के लिए:

public class MyActivity extends Activity {  
    private DBAccess dbAccess; 
    public MyActivity() { 
    dbAccess = new DBAccess(this); 
    }  
} 

एक दूसरे चरण के रूप में, आप RoboGuice तरह चौखटे की जांच के लिए मुश्किल तोड़ने के लिए चाहते हो सकता है निर्भरता। आप कोड कुछ ऐसा दिखेंगे:

public class MyActivity extends Activity {  
    @Inject private DBAccess dbAccess; 
    public MyActivity() { 
    }  
} 

हमें बताएं कि क्या आप अधिक जानकारी चाहते हैं!

संबंधित मुद्दे