【问题标题】:Android, content provider in library projectAndroid,图书馆项目中的内容提供者
【发布时间】:2012-04-25 17:25:18
【问题描述】:

我有一个库项目,它为许多需要相同数据库结构和功能的应用程序提供基本代码,我正在寻找实现此功能的最佳方法。 我主要关心的是如何提供非静态权限,以便我可以使用使用该库的应用程序的包名称来覆盖它。

所以在库项目中,我想我可以将以下常量更改为静态方法,这些方法将接受允许我从资源字符串或 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) 我不太了解静态 { URI_MATCHER.addUR } 声明,并且正在努力理解如何转换它?

2) 这是能够在任何应用程序中重用整个功能的最佳方法吗?如果不是什么会更好?

【问题讨论】:

  • 对于那些正在寻找相同问题的人,是的,您可以按照Stackoverflow comment 中的说明进行操作。

标签: android android-contentprovider


【解决方案1】:

我用类似这样的东西将 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 对象替换为 getUri(Context c) 函数,该函数会创建适合该应用程序的 Uri。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-05
    • 2021-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多