Java 具有多个表的ContentProvider

Java 具有多个表的ContentProvider,java,android,design-patterns,android-contentprovider,Java,Android,Design Patterns,Android Contentprovider,我想实现一个ContentProvider,它可以处理多个表。这是我到目前为止试过的。我编写了一个Java接口,它表示每个表应该在其CRUD类中实现的CRUD操作 public interface CRUDHandler { //UPDATE int update(Uri uri, ContentValues values, String selection,String[] selectionArgs); //READ Cursor query(Uri uri,

我想实现一个
ContentProvider
,它可以处理多个表。这是我到目前为止试过的。我编写了一个Java
接口
,它表示每个表应该在其CRUD类中实现的CRUD操作

public interface CRUDHandler {
    //UPDATE
    int update(Uri uri, ContentValues values, String selection,String[] selectionArgs);
    //READ
    Cursor query(Uri uri, String[] projection, String selection,String[] selectionArgs, String sortOrder) ;
    //CREATE
    Uri insert(Uri uri, ContentValues values);
    //DELETE
    int delete(Uri uri, String selection, String[] selectionArgs);
    //get Mime type
    String getType(Uri uri);
}
然后我编写了一个
摘要
,它为
内容提供者
定义了一个静态的
UriMatcher
,因此
扩展的每个类都应该添加它的
Uri
,该Uri识别它并为接口中的每个方法提供一个实现

该类如下所示:

public abstract class  ApplicationCRUD  implements CRUDHandler{

    public static final UriMatcher sUriMatcher;

    static {
        sUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
    }
}
此外,我为每个表创建了一个类,该表扩展了这个类,并将其
Uri
添加到抽象类中的
UriMatcher

以下是一个例子:

public class Table1CRUD extends ApplicationCRUD {
    //Setup Projection Map for Table1 
        private static HashMap<String , String>sTable1ProjectionMap;
        static {
            sTable1ProjectionMap.put(ApplicationProviderMetaData.Table1MetaData._ID, ApplicationProviderMetaData.Table1MetaData.TABLE_NAME+"."+ApplicationProviderMetaData.Table1MetaData._ID);
            sTable1ProjectionMap.put(ApplicationProviderMetaData.Table1MetaData.COL1, ApplicationProviderMetaData.Table1MetaData.TABLE_NAME+"."+ApplicationProviderMetaData.Table1MetaData.COL1);
            sTable1ProjectionMap.put(ApplicationProviderMetaData.Table1MetaData.COL2, ApplicationProviderMetaData.Table1MetaData.TABLE_NAME+"."+ApplicationProviderMetaData.Table1MetaData.COL2);
        }

        public static final int INCOMING_SINGLE_URI_INDICATOR = 5;
        public static final int INCOMING_COLLECTION_URI_INIDICATOR = 6;
    static {
        //standard URI 
        sUriMatcher.addURI(ApplicationProviderMetaData.AUTHORITY, "t1", INCOMING_COLLECTION_URI_INIDICATOR);
        sUriMatcher.addURI(ApplicationProviderMetaData.AUTHORITY, "t1/#", INCOMING_SINGLE_URI_INDICATOR);
        //here add your custom URI 

    }
    @Override
    public int update(Uri uri, ContentValues values, String selection,
            String[] selectionArgs) {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public Cursor query(Uri uri, String[] projection, String selection,
            String[] selectionArgs, String sortOrder) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public Uri insert(Uri uri, ContentValues values) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public int delete(Uri uri, String selection, String[] selectionArgs) {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public String getType(Uri uri) {
        // TODO Auto-generated method stub
        return null;
    }

}
现在我将
SQLiteOpenHelper
用作
ContentProvider

我在我的
ContentProvider
中定义了它的一个实例。我是否应该修改接口并提供对象
依赖项注入
的每个CRUD方法,以允许每个函数使用它访问数据库?我还想知道你对这种方法的看法:它足够好吗?这是否使我正在努力做的事情更有效率?我可以做哪些修改来改进此设计?

如果需要设计具有多个表的
ContentProvider
,则该应用程序是一个很好的资源。听起来你想做一些更复杂的事情,但也许会有帮助。

我已经完成了开源项目,在这个项目中,他们使用了多个表。您可以查看的各种项目,这里是一个。

我希望它能帮助您。

为什么不这样在内容提供商下创建多个表呢

假设您有两个名为A和B的表,它们的URI将是AUTHORITY/A,AUTHORITY/B

private static final int TableOne = 1; 
private static final int TableTwo = 2;

private static final UriMatcher uriMatcher;
static{
       uriMatcher.addUri(AUTHORITY,"A",TableOne);
       uriMatcher.addUri(AUTHORITY,"B",TableTwo);
     }

现在,您可以使用标准的switch case实现重写的方法,并正确映射到底层SQLite数据库类的方法。

不要用仅是此处链接的注释垃圾发送不相关的问题。有你在StackOverflow方面经验的人应该知道得更清楚。很抱歉打扰你,但我一直在尝试寻找当你有主数据表时如何处理CRUD操作的示例,例如,作者书籍、订单详细信息,但不幸的是,我什么都找不到。ContentProvider的
insert
方法就是一个例子,它只接受两个参数:Uri和
ContentValues
。我不知道在这种情况下该怎么办,因为我显然需要传递两个
URI
s,也许还有比单个
ContenteValues
对象更复杂的东西。你知道我可以用什么资源作为指导吗?
private static final int TableOne = 1; 
private static final int TableTwo = 2;

private static final UriMatcher uriMatcher;
static{
       uriMatcher.addUri(AUTHORITY,"A",TableOne);
       uriMatcher.addUri(AUTHORITY,"B",TableTwo);
     }