gpt4 book ai didi

java - 具有多个表的 ContentProvider

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:17:47 26 4
gpt4 key购买 nike

我想实现一个操作多个表的ContentProvider。到目前为止,这是我尝试过的。我编写了一个 Java Interface,表示每个表都应在其 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);
}

然后我写了一个 abstract classContentProvider 定义了一个静态的 UriMatcher 所以每个类 extends 这个类应该添加它的 Uri 来标识它并为接口(interface)中的每个方法提供一个实现。

这个类看起来像这样:

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

}

现在我的 ContentProvider 看起来像这样:

public class ApplicationProvider  extends ContentProvider{
//Define TAG FOR EACH CLASS FOR DEBUGGING
private static final String TAG = "ApplicationProvider";
// Application CRUD Handlers use to support multiple tables inside the content provider
private static Table1CRUD table1CRUD;
private static Table2CRUD table2CRUD;

static {
table1CRUD = new Table1CRUD();
table2CRUD= new Table2CRUD();

}
@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
int uriMatchResult = ApplicationCRUD.sUriMatcher.match(uri);
//case Table1
if(uriMatchResult == Table1CRUD.INCOMING_COLLECTION_URI_INIDICATOR ||uriMatchResult == Table1CRUD.INCOMING_SINGLE_URI_INDICATOR )
{
return table1CRUD.delete(uri, selection, selectionArgs);
}
case Table2
else if(uriMatchResult == Table2.INCOMING_COLLECTION_URI_INDICATOR|| uriMatchResult ==Table2.INCOMING_SINGLE_URI_INDICATOR){
return table2CRUD.delete(uri, selection, selectionArgs);
}

else{
throw new IllegalArgumentException("Unknown Uri "+uri);
}
}

现在我正在使用 SQLiteOpenHelper 作为 ContentProvider 中的私有(private)类我在我的 ContentProvider 中定义了它的一个实例。我是否应该修改接口(interface)并提供对象 Dependency Injection 的每个 CRUD 方法,让每个函数使用它来访问数据库?我还想知道您对这种方法的看法:它足够好吗?它能让我做的事情更有效率吗?我可以做哪些修改来改进此设计?

最佳答案

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

关于java - 具有多个表的 ContentProvider,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9881758/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com