2012-04-25 32 views
8

Tôi có một dự án thư viện cung cấp mã cơ sở cho một số ứng dụng mà tất cả đều cần cấu trúc và chức năng cơ sở dữ liệu giống nhau và tôi đang tìm cách tốt nhất để thực hiện điều này. Mối quan tâm chính của tôi thực sự là về cách cung cấp quyền hạn không tĩnh để tôi có thể ghi đè lên nó bằng tên gói của ứng dụng sử dụng thư viện.Android, nhà cung cấp nội dung trong dự án thư viện

Vì vậy, trong dự án thư viện tôi đã suy nghĩ tôi có thể thay đổi hằng số sau với các phương pháp tĩnh mà sẽ chấp nhận một bối cảnh mà sẽ cho phép tôi để có được những quyền lực từ một chuỗi tài nguyên hoặc từ phương pháp context.getPackageName

thư viện mô hình dự án

public static final class Questions implements BaseColumns { 
//  public static final Uri CONTENT_URI = 
//   Uri.parse("content://" + Config.AUTHORITY + "/questions"); 
// use getAuthority instead which in turn will just get the package ae. Will this work? 
     public static Uri getContentUri(Context c){ 
      return Uri.parse("content://" + getAuthority(c) + "/questions"); 
     } 
    ... 
    } 

public static String getAuthority(Context c){ 
    return c.getPackageName + ".QuizProvider"; 
} 

dự án thư viện cung cấp nội dung

public class QuizProvider extends ContentProvider { 

// private SQLiteDatabase mDB; 

    private static final String TAG = "MyLog"; 

    private static final String DATABASE_NAME = "quiz.db"; 

    private static final int DATABASE_VERSION = 1; 

    private static final int QUESTIONS = 1; 
    private static final int QUESTION_ID = 2; 

    private static final UriMatcher URI_MATCHER = new UriMatcher(
     UriMatcher.NO_MATCH); 

    private static Map<String, String> QUESTION_LIST_PROJECTION_MAP = null; 

    private DatabaseHelper mOpenHelper; 

    /** 
    * This class helps open, create, and upgrade the database file. 
    */ 

    private static class DatabaseHelper extends SQLiteOpenHelper { 

    @Override 
    public Uri insert(Uri uri, ContentValues values) { 
     int match = URI_MATCHER.match(uri); 
     switch (match) { 
     case QUESTIONS: 
      return insertQuestion(values); 
     ... 
     } 

... 
    @Override 
    public Cursor query(Uri uri, String[] projection, String selection, 
      String[] selectionArgs, String sortOrder) { 
     SQLiteQueryBuilder qb = new SQLiteQueryBuilder(); 

     switch (URI_MATCHER.match(uri)) { 
     case QUESTIONS: 
      qb.setTables(QuizModel.Questions.TABLE_NAME); 
      qb.setProjectionMap(QUESTION_LIST_PROJECTION_MAP); 
      break; 
... 
     } 

//How do I change this?  
     static { 
      URI_MATCHER.addURI(Config.AUTHORITY, QuizModel.Questions.TABLE_NAME, QUESTIONS); 
    ... 
      QUESTION_LIST_PROJECTION_MAP = new HashMap<String, String>(); 
    ... 
     } 

1) tôi không thực sự hiểu được stati c {URI_MATCHER.addUR} tuyên bố và tôi đang đấu tranh để hiểu làm thế nào tôi có thể chuyển đổi điều này?

2) Đây có phải là cách tiếp cận tốt nhất để có thể sử dụng lại toàn bộ chức năng trong bất kỳ ứng dụng nào không? Nếu không thì điều gì sẽ tốt hơn?

+0

Đối với những người đang tìm kiếm cùng một câu hỏi, có bạn có thể như đã nêu trong [Nhận xét Stackoverflow] này (http://stackoverflow.com/questions/16268119/dynamically-set-the-authority-of-a- contentprovider # comment23303216_16270100). – Sufian

Trả lời

0

Tôi subclassed UriMatcher với một cái gì đó như thế này:

private static final UriMatcher sUriMatcher 
     = new UriMatcher(UriMatcher.NO_MATCH){ 
    @Override 
    public int match(Uri uri) { 
     return super.match(uri.buildUpon().authority(AUTHORITY).build()); 
    }  
}; 

Ứng dụng này sử dụng thư viện nên tuyên bố cung cấp dịch vụ trong biểu hiện với chuỗi thẩm quyền riêng của nó.

Bạn cũng có thể thay thế các đối tượng Uri tĩnh công khai trong các lớp mô hình của mình bằng chức năng getUri(Context c) tạo Uri thích hợp cho ứng dụng THAT.

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