2012-04-25 48 views
8

我有一個庫項目,爲許多應用程序提供基本代碼,這些應用程序都需要相同的數據庫結構和功能,我正在尋找實現此目的的最佳方法。 我主要關心的是如何提供非靜態權限,以便可以使用使用該庫的應用程序的包名稱覆蓋它。Android,圖書館項目中的內容提供商

所以在庫項目我想我可以改變以下常量靜態方法將接受一個方面,讓我擺脫資源字符串或從context.getPackageName方法

庫的權限項目模型

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"; 
} 

庫項目內容提供商

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)我真的不明白爲static c {URI_MATCHER.addUR}聲明,我正在努力理解如何將其轉換?

2)這是否能夠在任何應用程序中重用整個功能的最佳方法?如果不是,會更好?

+0

對於那些正在尋找相同的問題,是的,你可以在這個[Stackoverflow評論](http://stackoverflow.com/questions/16268119/dynamically-set-the-authority-of-a- ContentProvider的#comment23303216_16270100)。 – Sufian 2017-05-11 13:34:38

回答

0

我子類UriMatcher像這樣的東西:

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

它使用圖書館應申報清單中的供應商與它自己的權威字符串的應用程序。

您還可以使用getUri(Context c)函數替換模型類中的公共靜態Uri對象,該函數創建適合THAT應用程序的Uri。