Android中使用内容提供者公开多个表格的最佳做法是什么?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (16)

我正在建立一个应用程序,我有一个活动桌子和一个场地桌子。我希望能够授予其他应用程序访问此数据。我有几个与这类问题的最佳实践有关的问题:

  1. 我应该如何构造数据库类? 我目前有EventsDbAdapter和VenuesDbAdapter类,它们提供查询每个表的逻辑,同时拥有一个单独的DbManager(扩展SQLiteOpenHelper),用于管理数据库版本,创建/升级数据库以及访问数据库(getWriteable / ReadeableDatabase)。这是推荐的解决方案,还是我会更好地整合一个类(即DbManager)或分离一切,让每个适配器扩展SQLiteOpenHelper?
  2. 我应该如何为多个表设计内容提供者? 扩展前面的问题,我应该为整个应用程序使用一个Content Provider,还是应该为事件和场所创建单独的提供程序?
提问于
用户回答回答于

我建议查看Android 2.x ContactProvider的源代码。他们通过提供专门的视图处理交叉表查询,然后在后端运行查询。在前端,通过单个内容提供者可以通过各种不同的URI访问调用者。你可能还需要提供一个或两个用于保存表字段名称和URI字符串的常量。这些类可以作为一个API包含或作为类的放置提供,并且使消费应用程序更容易使用。

用户回答回答于

首先,你需要创建多个CONTENT_URI:

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

然后你扩展你的URI匹配器:

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

然后创建你的表格:

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

你将使用开关块来确定使用哪个表。这是我的插入代码:

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

扫码关注云+社区