【发布时间】:2014-04-01 17:30:18
【问题描述】:
我的应用中有一个内容提供程序,但我真的不喜欢它:-)。提供者是在阅读大量文章(如the official one 和this unofficial one)后创建的。
我真正不喜欢的是提供程序类中的重复数量(请参阅下面非常精简的代码)。即使是两个(或四个,这取决于你如何计算)内容类型,代码也太多了。
我考虑过另一条路:在内容提供程序中进行原始 SQL 查询,但不确定这是否会更优雅。
请提供一种更好的方法来创建 Android 内容提供程序,然后是下面代码中的方法。
public abstract class BaseProvider extends ContentProvider
{
protected DatabaseHelper m_helper;
protected static class DatabaseHelper extends SQLiteOpenHelper
{
private static final String DATABASE_NAME = "my.db";
private static final int DATABASE_VERSION = 4;
public DatabaseHelper(Context context)
{
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db)
{
FolderTable.onCreate(db);
TrackTable.onCreate(db);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
{
FolderTable.onUpgrade(db, oldVersion, newVersion);
TrackTable.onUpgrade(db, oldVersion, newVersion);
}
}
@Override
public boolean onCreate()
{
m_helper = new DatabaseHelper(getContext());
return true;
}
// ...
}
public class MyProvider extends BaseProvider
{
private static final UriMatcher sURIMatcher = new UriMatcher(UriMatcher.NO_MATCH);
private static final int FOLDERS = 10;
private static final int FOLDER_ID = 20;
private static final int TRACKS = 30;
private static final int TRACK_ID = 40;
private static final String FOLDERS_BASE_PATH = "folders";
private static final String TRACKS_BASE_PATH = "tracks";
public static final String AUTHORITY = ".contentprovider.MyProvider";
private static final String CONTENT_URI_BASE = "content://" + AUTHORITY + "/";
public static final Uri FOLDERS_CONTENT_URI = Uri.parse(CONTENT_URI_BASE + FOLDERS_BASE_PATH);
public static final Uri TRACKS_CONTENT_URI = Uri.parse(CONTENT_URI_BASE + TRACKS_BASE_PATH);
static
{
sURIMatcher.addURI(AUTHORITY, FOLDERS_BASE_PATH, FOLDERS);
sURIMatcher.addURI(AUTHORITY, FOLDERS_BASE_PATH + "/#", FOLDER_ID);
sURIMatcher.addURI(AUTHORITY, TRACKS_BASE_PATH, TRACKS);
sURIMatcher.addURI(AUTHORITY, TRACKS_BASE_PATH + "/#", TRACK_ID);
}
@Override
public Cursor query(Uri uri, String[] projection, String selection,
String[] selectionArgs, String sortOrder)
{
SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
int uriType = sURIMatcher.match(uri);
switch (uriType)
{
case FOLDERS:
queryBuilder.setTables(getTablesForFolders());
break;
case FOLDER_ID:
queryBuilder.setTables(FolderTable.TABLE_NAME);
queryBuilder.appendWhere(FolderTable.COLUMN_ID + "=" + uri.getLastPathSegment());
break;
case TRACKS:
queryBuilder.setTables(getTablesForTracks());
break;
case TRACK_ID:
queryBuilder.setTables(TrackTable.TABLE_NAME);
queryBuilder.appendWhere(TrackTable.COLUMN_ID + "=" + uri.getLastPathSegment());
break;
default:
throw new IllegalArgumentException("Unknown URI: " + uri);
}
SQLiteDatabase db = m_helper.getWritableDatabase();
if (db == null)
return null;
Cursor cursor = queryBuilder.query(db, projection, selection, selectionArgs, null, null, sortOrder);
if (cursor == null)
return null;
setNotificationUri(cursor, uri);
return cursor;
}
// ....
}
【问题讨论】:
-
你在说什么重复?您能否更具体一点并突出显示代码中的区域?
标签: java android refactoring android-contentprovider code-duplication