2012-04-25 10 views
8

Ich habe ein Bibliotheksprojekt, das den Basiscode für eine Reihe von Anwendungen bereitstellt, die alle dieselbe Datenbankstruktur und Funktionalität benötigen, und ich suche nach dem besten Weg, dies zu implementieren. Mein Hauptanliegen ist es, eine nicht-statische Autorität bereitzustellen, damit ich sie mit dem Paketnamen der App überschreiben kann, die die Bibliothek verwendet.Android, Inhaltsanbieter im Bibliotheksprojekt

So in der Bibliothek Projekt, das ich dachte, ich könnte die folgenden Konstanten, um statische Methoden zu ändern, die einen Kontext akzeptieren, den mir erlaubt, die Autorität von einem Ressourcen-String zu erhalten oder aus der context.getPackageName Methode

Bibliothek Projektmodell

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

Bibliotheksprojekt Content-Provider

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) ich verstehe nicht wirklich die stati c {URI_MATCHER.addUR} Deklaration und ich habe Mühe zu verstehen, wie ich das umsetzen kann?

2) Ist das der beste Ansatz, um die gesamte Funktionalität in welcher App wiederzuverwenden? Wenn nicht, was wäre besser?

+0

Für diejenigen, die für die gleiche Frage suchen, ja können Sie wie in diesem [Stackoverflow Kommentar] (http://stackoverflow.com/questions/16268119/dynamicly-set-the-authority-of-a- contentprovider # comment23303216_16270100). – Sufian

Antwort

0

ich subclassed UriMatcher mit etwas wie folgt aus:

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

Die App, die die Bibliothek verwendet, sollte der Anbieter im Manifest mit eigener Autorität Zeichenfolge deklarieren.

Sie können die öffentlichen statischen Uri-Objekte in Ihren Modellklassen auch durch eine getUri(Context c)-Funktion ersetzen, die den URI erstellt, der für THAT-Anwendung geeignet ist.

Verwandte Themen