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

tôi nhận được lỗi nàyTại sao tôi không thể sử dụng Resources.getSystem() mà không có lỗi Runtime?

01-14 12: 20: 57,591: E/AndroidRuntime (1825): Nguyên nhân: android.content.res.Resources $ NotFoundException: String ID tài nguyên # 0x7f040003

mã gây ra lỗi là dòng duy nhất bên createProfileTable đặc biệt, Resources.getSystem(). getString (R.string.create_profile_table_sql) nếu tôi sử dụng một biến lớp để tổ chức một Bối cảnh và làm context.getString (R.string.create_profile_table_sql) Tôi không hiểu bất kỳ lỗi nào nhưng tôi không muốn làm điều đó bởi vì tôi muốn tránh rò rỉ bộ nhớ và theo những gì tôi biết điều này sẽ làm việc. Bất kỳ ý tưởng gì đang xảy ra?

+1

Điều này không thực sự trả lời câu hỏi của bạn, nhưng tài nguyên Chuỗi thường dành cho Chuỗi hiển thị do người dùng hiển thị (do đó bạn có thể cung cấp các ngôn ngữ khác nhau sau này nếu bạn muốn). Trong tình huống này, việc xác định một chuỗi không đổi định nghĩa câu lệnh tạo của bạn sẽ không sao. – Brandon

Trả lời

16

Theo tài liệu Android, Resources.getSystem() chỉ cung cấp tài nguyên cấp hệ thống, không cung cấp tài nguyên cấp ứng dụng (như tài nguyên bên trong tệp strings.xml của bạn).

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

Hãy thử sử dụng bối cảnh của ứng dụng nếu bạn thực sự muốn lấy dây của bạn theo cách này, hoặc đưa đề nghị của tôi trong các bình luận cho câu hỏi của bạn.

+0

Cảm ơn, Brandon. Tôi đã không biết rằng Resources.getSystem() sẽ không trả lại tài nguyên ứng dụng của tôi, mặc dù nó có vẻ hơi rõ ràng bây giờ (hindsight và như vậy). Tôi cũng sẽ xem xét sử dụng một chuỗi liên tục để thay thế. – Garzahd

+0

+1. Đó là một lỗi rất khó chịu và khó tìm thấy. Chắc chắn, thông điệp hữu ích. – Gangnus

3

Sử dụng Resources.getSystem(). GetWhatEver() bạn chỉ có thể truy cập tài nguyên trên toàn hệ thống (bạn gặp lỗi vì không có tài nguyên trên toàn hệ thống với ID của bạn). Vì ID tài nguyên không phải là duy nhất trên các ứng dụng bạn cần cung cấp ứng dụng khi truy cập tài nguyên. Trong Android, điều này được thực hiện bằng cách sử dụng ngữ cảnh. Vì vậy, nếu bạn muốn truy cập một số tài nguyên mà bạn cần phải sử dụng nó như thế này

context.getResource().getString(myID); 

Ngoài ra bình luận Brandon là đúng.

+0

Vì vậy, tôi phải sử dụng một ngữ cảnh để truy cập strings.xml trừ khi tôi chọn sử dụng một chuỗi không đổi trong mã Java của tôi để thay thế. Cảm ơn bạn vì câu trả lời. – Garzahd

0

Bạn có thể lấy parametr ngữ cảnh trong hàm theo tham số hoặc bằng biến tĩnh hoặc bằng hàm getApplicationContext().

Các vấn đề liên quan