2012-01-14 15 views
7
public class BobDatabase extends SQLiteOpenHelper{ 
private static final String DATABASE_NAME = "bob.db"; 
private static final int DATABASE_VERSION = 1; 
public static final String DEFAULT_PROFILE = "default_profile"; 

public BobDatabase(Context context) 
{ 
    super(context, DATABASE_NAME, null, DATABASE_VERSION); 
} 

@Override 
public void onCreate(SQLiteDatabase database) 
{ 
    createProfileTable(database); 
    createTimeTable(database); 
    createEventTable(database); 
    createLocationTable(database); 
} 

/** 
* Creates a table for Profile objects, executes the string create_profile_table_sql 
* contained within strings.xml 
* @param database 
*/ 
public void createProfileTable(SQLiteDatabase database) 
{ 
    database.execSQL(Resources.getSystem().getString(R.string.create_profile_table_sql)); 
}} 

मैं इस त्रुटि मिलती हैमैं रनटाइम त्रुटि के बिना Resources.getSystem() का उपयोग क्यों नहीं कर सकता?

01-14 12: 20: 57.591: ई/AndroidRuntime (1825): android.content.res.Resources $ NotFoundException: की वजह से स्ट्रिंग संसाधन आईडी # 0x7f040003

कोड है कि त्रुटि होती है createProfileTable अंदर एकल लाइन है विशेष रूप से, Resources.getSystem()। GetString (R.string.create_profile_table_sql) अगर मैं एक वर्ग चर का उपयोग एक संदर्भ पकड़ और context.getString करने के लिए (R.string.create_profile_table_sql) मुझे नहीं मिलता कोई भी त्रुटि लेकिन मैं ऐसा नहीं करना चाहता क्योंकि मैं स्मृति रिसाव से बचना चाहता हूं और जो मुझे पता है उसे काम करना चाहिए। कोई विचार क्या हो रहा है?

+1

यह वास्तव में आपके प्रश्न का उत्तर नहीं देता है, लेकिन स्ट्रिंग संसाधन आम तौर पर उपयोगकर्ता-प्रदर्शित करने योग्य स्ट्रिंग्स के लिए होते हैं (ताकि आप बाद में अलग-अलग भाषाओं को प्रदान कर सकें)। इस स्थिति में, एक स्थिर स्ट्रिंग को परिभाषित करना जो आपके निर्माण कथन को परिभाषित करता है ठीक है। – Brandon

उत्तर

16

एंड्रॉइड प्रलेखन के अनुसार, Resources.getSystem() केवल सिस्टम-स्तरीय संसाधन प्रदान करता है, न कि एप्लिकेशन-स्तरीय वाले (जैसे आपकी स्ट्रिंग्स.एक्सएमएल फाइल के अंदर संसाधन)।

http://developer.android.com/reference/android/content/res/Resources.html#getSystem()

आवेदन के संदर्भ का उपयोग कर यदि आप वास्तव में अपने तार इस तरह से प्राप्त करना चाहते हैं प्रयास करें, या अपने प्रश्न का टिप्पणी में अपने सुझाव ले लो।

+0

धन्यवाद, ब्रैंडन। मैं अनजान था कि Resources.getSystem() मेरे एप्लिकेशन संसाधनों को वापस नहीं करेगा, हालांकि यह अब थोड़ा स्पष्ट लगता है (हिंडसाइट और इस तरह)। मैं इसके बजाय एक स्थिर स्ट्रिंग का उपयोग करने पर भी विचार करूंगा। – Garzahd

+0

+1। यह एक बहुत ही अप्रिय और कठिन पाया गया त्रुटि है। निश्चित रूप से, उपयोगी संदेश। – Gangnus

3

संसाधनों का उपयोग करना .getSystem()। GetWhatEver() आप केवल सिस्टम-व्यापी संसाधनों तक पहुंच सकते हैं (आपको त्रुटि मिलती है क्योंकि आपकी आईडी के साथ सिस्टम-व्यापी संसाधन नहीं है)। चूंकि संसाधन आईडी उन अनुप्रयोगों में अद्वितीय नहीं है, इसलिए संसाधनों तक पहुंचने पर आपको एप्लिकेशन प्रदान करने की आवश्यकता होती है। एंड्रॉइड में यह संदर्भ का उपयोग कर किया जाता है। तो तुम कुछ संसाधन का उपयोग करना चाहते हैं तो आप इस

context.getResource().getString(myID); 
से कि ब्रैंडन की टिप्पणी सही है

अलावा तरह इसका इस्तेमाल करने की जरूरत है।

+0

इसलिए, मुझे स्ट्रिंग्स.एक्सएमएल तक पहुंचने के लिए एक संदर्भ का उपयोग करना चाहिए जब तक कि मैं इसके बजाय अपने जावा कोड में निरंतर स्ट्रिंग का उपयोग नहीं करना चाहता। आपके उत्तर के लिए धन्यवाद। – Garzahd

0

आप पैरामीटर में या स्थिर चर द्वारा, या getApplicationContext() फ़ंक्शन द्वारा फ़ंक्शन में संदर्भ पैरामीटर प्राप्त कर सकते हैं।