2012-04-25 13 views
8

que tiene un proyecto de biblioteca que proporciona el código base para una serie de aplicaciones que todas las necesidades de la misma estructura de base de datos y funcionalidad y estoy buscando la mejor forma de implementar esto. Mi principal preocupación es realmente acerca de cómo proporcionar una autoridad no estática, así que puedo anularla con el nombre del paquete de la aplicación que usa la biblioteca.Android, proveedor de contenido en el proyecto de la biblioteca

Así que en el proyecto de la biblioteca estaba pensando que podría cambiar las siguientes constantes a métodos estáticos que aceptarán un contexto que permita a mí para obtener la autoridad de una cadena de recursos o desde el método context.getPackageName

biblioteca modelo de proyecto

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

proyecto de biblioteca proveedor de contenido

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) realmente no entiendo la Stati c {URI_MATCHER.addUR} declaración y estoy luchando por entender cómo puedo convertir esto?

2) ¿Es este el mejor enfoque para poder volver a utilizar toda la funcionalidad en cualquier aplicación? Si no, ¿qué sería mejor?

+0

Para aquellos que están buscando para la misma pregunta, sí que lo puede indicado en esta [comentario Stackoverflow] (http://stackoverflow.com/questions/16268119/dynamically-set-the-authority-of-a- contentprovider # comment23303216_16270100). – Sufian

Respuesta

0

I subclases UriMatcher con algo como esto:

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

La aplicación que utiliza la biblioteca debe declarar el proveedor en el manifiesto con su propia cadena de autoridad.

También puede reemplazar los objetos Uri estáticos públicos en sus clases de modelo con una función getUri(Context c) que crea el Uri apropiado para esa aplicación.

Cuestiones relacionadas