2012-01-14 17 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)); 
}} 

bu hatayıNeden Çalışma Zamanı hatası olmadan Resources.getSystem() kullanamıyorum? 20:

01-14 12 olsun 57,591: E/AndroidRuntime (1825): android.content.res.Resources $ NotFoundException: Neden Olduğu Dize kaynak kimliği # 0x7f040003

hataya neden olur

kod createProfileTable içindeki tek sıra spesifik olarak, Resources.getSystem(). getString (R.string.create_profile_table_sql) bir bağlam tutun ve context.getString yapmak için bir sınıf değişkeni kullanmak durumunda (R.string.create_profile_table_sql) Anlamıyorum hatalar ama bunu yapmak istemiyorum çünkü bellek sızıntılarını önlemek istiyorum ve bildiğim göre bu işe yaramalı. Ne olduğuna dair bir fikrin var mı?

+1

Bu, sorunuzu gerçekten yanıtlamıyor, ancak Dize kaynakları genellikle kullanıcı tarafından görüntülenebilir Dizeler içindir (böylece daha sonra farklı diller sağlayabilirsiniz). Bu durumda, oluşturma ifadenizi tanımlayan sabit bir dizeyi tanımlamak iyi olur. – Brandon

cevap

16

Android belgelerine göre, Resources.getSystem() yalnızca sistem düzeyinde kaynaklar sağlar; uygulama düzeyinde olanlar (strings.xml dosyanızın içindeki kaynaklar gibi).

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

gerçekten dizeleri bu şekilde almak istiyorsanız uygulamanın bağlamı kullanarak deneyin veya sorunun yorumunda benim öneri almak.

+0

Teşekkürler, Brandon. Resources.getSystem() 'ın uygulama kaynaklarına geri dönmeyeceğinden habersizdeydim, ancak şu anda biraz açık gibi görünüyor (arkadan ve böyle). Bunun yerine sabit bir dize kullanmayı düşüneceğim. – Garzahd

+0

+1. Bu çok tatsız ve bulunması zor bir hatadır. Kesinlikle, yararlı mesaj. – Gangnus

3

Resources.getSystem() yöntemini kullanarak getWhatEver() yalnızca sistem kaynaklarına erişebilir (hatayla karşılaşırsınız, çünkü sistem kimliğinizin kaynağı kimliğinizle olmadığından). Kaynak kimliği uygulamalar arasında benzersiz olmadığından, bir kaynağa erişirken uygulamayı sağlamanız gerekir. Android'de bu İçerik kullanılarak yapılır. Bazı kaynağa erişmek istiyorsanız Yani Brandon'ın açıklama doğru olduğunu gelen Bunun dışında

context.getResource().getString(myID); 

gibi kullanmak gerekir.

+0

Yani, Java kodumda sabit bir dize kullanmayı seçmediğim sürece, strings.xml dosyasına erişmek için bir bağlam kullanmalıyım. Cevabınız için teşekkür ederim. – Garzahd

0

Buradaki bağlam parametrini, parametreye veya statik bir değişkene veya getApplicationContext() işlevine göre alabilirsiniz.

İlgili konular