jam*_*esc 9 android android-contentprovider
我有一个库项目,为许多需要相同数据库结构和功能的应用程序提供基本代码,我正在寻找实现它的最佳方法.我主要关心的是如何提供非静态权限,以便我可以使用使用该库的应用程序的包名称来覆盖它.
所以在库项目中我想我可以将以下常量更改为静态方法,这些方法将接受允许我从资源字符串或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";
}
Run Code Online (Sandbox Code Playgroud)
图书馆项目内容提供者
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>();
...
}
Run Code Online (Sandbox Code Playgroud)
1)我真的不了解静态{URI_MATCHER.addUR}声明,我很难理解如何转换它?
2)这是能够在任何应用程序中重用整个功能的最佳方法吗?如果没有什么会更好?
小智 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());
}
};
Run Code Online (Sandbox Code Playgroud)
使用该库的应用程序应使用其自己的权限字符串在清单中声明提供程序。
您还可以将模型类中的公共静态 Uri 对象替换为getUri(Context c)创建适合该应用程序的 Uri 的函数。
| 归档时间: |
|
| 查看次数: |
5510 次 |
| 最近记录: |