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 { URI _MATCHER.addUR } и пытаюсь понять, как его преобразовать?

2 )Является ли это лучшим подходом для повторного использования всей функциональности в любом приложении? Если нет, что было бы лучше?

9
задан jamesc 26 April 2012 в 03:20
поделиться