我在Android中创建自定义ContentProvider,我发现的所有示例都显示数据库名称是硬编码的,实例化如下:
public class ItemProvider extends ContentProvider {
private static String DATABASE_NAME = "xyz";
public static class ItemDatabaseHelper extends SQLiteOpenHelper {
ItemDatabaseHelper(Context context) {
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
我想要做的是在运行时使用变量作为数据库名称,我不想在类中硬编码数据库名称。我试图找到使用ContentProvider类执行此操作的示例,并查看了文档。如果我放弃ContentProvider类并使用SQLiteOpenHelper类,我可以这样做,因为我可以将数据库名称作为参数传递给构造函数,但我无法弄清楚它是否可能用于ContentProvider。以下是使用SQLiteOpenHelper获取数据库变量名的方法:
public static class ItemDatabaseHelper extends SQLiteOpenHelper {
ItemDatabaseHelper(Context context, String dbname) {
super(context, dbname, null, DATABASE_VERSION);
}
任何人都可以帮我获取内容提供商的可变数据库名称吗?
感谢。
答案 0 :(得分:1)
我自己并没有真正使用ContentProviders,但是查看我猜测问题根源的文档是你自己没有实例化ContentProvider,而是在需要处理请求时Android会这样做。
如果您希望应用程序在运行时定义数据库名称,那么您可以简单地使用公共静态变量,您可以从应用程序的其他部分适当地设置该变量。然后,您可以从ContentProvider
引用此内容。
或者,如果您希望从ContentProvider
请求某些内容的人能够指定要查询的数据库,那么从文档看起来您可以使用请求URI的路径来指定要查询的数据库。
此处详细说明了请求URI的结构:http://developer.android.com/guide/topics/providers/content-providers.html#urisum并在此页面上显示:
权限是标识提供者而不是路径的标识;您的提供商可以您选择的任何方式解释URI的路径部分。
举个例子,我想你可以使用以下形式的URI:
content://com.example.yourprovider/DB_REF/ID
然后在实现ContentProvider
的抽象方法时,您可以解析URI以确定要使用的数据库。
提醒一句 - 如果您打算使用此方法,那么我建议不要直接使用传入的值。对有限列表使用某种验证会好得多,这样人们就不能只查询任何数据库(如果他们知道他们的名字)。
希望这是有道理的:)
答案 1 :(得分:1)
首先,我要说的是,我在网上看了很多关于ContentProvider代码的例子,而最终帮助我的那个例子就是这个:
http://mobile.tutsplus.com/tutorials/android/android-sdk_content-providers/
我和你的情况非常相似,我希望有几个不同名称的数据库,其中包含车辆燃油里程数据。每个名称由车辆名称(由用户指定)和当前年份以及固定文本“fuel_data”组成,以使数据库文件名易于阅读。
与我发现的所有示例不同,我没有在ContentProvider的onCreate方法中创建数据库的实例。这是因为我当时还不知道车辆名称,这要归功于我编写代码的方式(以及ContentProviders在Activity生命周期的早期实例化的事实)。
一旦我知道了车辆名称(我可以从中轻松构建数据库名称),我就会调用一个简单的方法,我将其添加到ContentProvider类中。正如您所看到的,它所做的只是关闭先前的数据库(如果一个是打开的)并打开新的数据库(使用我现在可用的名称)。
每次用户选择新车时,我都会再次调用此方法。
`private static FuelDatabase mDB = null;
public static void switchDatabases( Context context, String newVehicleName )
{
if ( mDB != null )
{
mbB.close();
}
mDB = new FuelDatabase( context, newVehicleName + "." + getCurrentYear( context ) );
}`