2012-04-25 5 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)私は本当にstatiを理解していませんc {URI_MATCHER.addUR}宣言を宣言し、これをどのように変換できるかを理解するのに苦労していますか?

2)これは、どのアプリでも機能全体を再利用できる最良の方法ですか?何が良いのだろうか?

+0

同じ質問をお探しの方には、この[Stackoverflow comment](http://stackoverflow.com/questions/16268119/dynamically-set-the-authority-of-a- contentprovider#comment23303216_16270100)。 – Sufian

答えて

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()); 
    }  
}; 

ライブラリを使用して、アプリケーションがそれ自身の権限文字列を持つマニフェストでプロバイダを宣言する必要があります。

モデルクラスのパブリック静的Uriオブジェクトを、THATアプリケーションに適したUriを作成するgetUri(Context c)関数に置き換えることもできます。

関連する問題