Best practices for exposing multiple tables using content providers in Android

前端 未结 5 485
迷失自我
迷失自我 2020-12-04 05:19

I\'m building an app where I have a table for events and a table for venues. I want to be able to grant other applications access to this data. I have a few questions relate

5条回答
  •  [愿得一人]
    2020-12-04 05:40

    It's probably a bit late for you, but others may find this useful.

    First you need to create multiple CONTENT_URIs

    public static final Uri CONTENT_URI1 = 
        Uri.parse("content://"+ PROVIDER_NAME + "/sampleuri1");
    public static final Uri CONTENT_URI2 = 
        Uri.parse("content://"+ PROVIDER_NAME + "/sampleuri2");
    

    Then you expand your URI Matcher

    private static final UriMatcher uriMatcher;
    static {
        uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
        uriMatcher.addURI(PROVIDER_NAME, "sampleuri1", SAMPLE1);
        uriMatcher.addURI(PROVIDER_NAME, "sampleuri1/#", SAMPLE1_ID);      
        uriMatcher.addURI(PROVIDER_NAME, "sampleuri2", SAMPLE2);
        uriMatcher.addURI(PROVIDER_NAME, "sampleuri2/#", SAMPLE2_ID);      
    }
    

    Then create your tables

    private static final String DATABASE_NAME = "sample.db";
    private static final String DATABASE_TABLE1 = "sample1";
    private static final String DATABASE_TABLE2 = "sample2";
    private static final int DATABASE_VERSION = 1;
    private static final String DATABASE_CREATE1 =
        "CREATE TABLE IF NOT EXISTS " + DATABASE_TABLE1 + 
        " (" + _ID1 + " INTEGER PRIMARY KEY AUTOINCREMENT," + 
        "data text, stuff text);";
    private static final String DATABASE_CREATE2 =
        "CREATE TABLE IF NOT EXISTS " + DATABASE_TABLE2 + 
        " (" + _ID2 + " INTEGER PRIMARY KEY AUTOINCREMENT," + 
        "data text, stuff text);";
    

    Don't forget to add the second DATABASE_CREATE to onCreate()

    You are going to use a switch-case block to determine what table is used. This is my insert code

    @Override
    public Uri insert(Uri uri, ContentValues values) {
        Uri _uri = null;
        switch (uriMatcher.match(uri)){
        case SAMPLE1:
            long _ID1 = db.insert(DATABASE_TABLE1, "", values);
            //---if added successfully---
            if (_ID1 > 0) {
                _uri = ContentUris.withAppendedId(CONTENT_URI1, _ID1);
                getContext().getContentResolver().notifyChange(_uri, null);    
            }
            break;
        case SAMPLE2:
            long _ID2 = db.insert(DATABASE_TABLE2, "", values);
            //---if added successfully---
            if (_ID2 > 0) {
                _uri = ContentUris.withAppendedId(CONTENT_URI2, _ID2);
                getContext().getContentResolver().notifyChange(_uri, null);    
            }
            break;
        default: throw new SQLException("Failed to insert row into " + uri);
        }
        return _uri;                
    }
    

    You will need to devide up the delete, update, getType, etc. Wherever your provider calls for DATABASE_TABLE or CONTENT_URI you will add a case and have DATABASE_TABLE1 or CONTENT_URI1 in one and #2 in the next and so on for as many as you want.

提交回复
热议问题