ContentProvider的可变数据库名称

时间:2011-08-01 09:38:32

标签: android android-contentprovider

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

任何人都可以帮我获取内容提供商的可变数据库名称吗?

感谢。

2 个答案:

答案 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 ) );
 }`