2011-08-01 60 views
2

我创造的Android定制的ContentProvider,我发现显示数据库名称的所有实例进行硬编码实例是这样的:变量的数据库名称的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); 
    } 

谁能帮助我获得内容提供商的变量数据库名称?

谢谢。

回答

1

我自己并没有真正使用过ContentProvider,但看着文档我猜测问题的根源在于你没有自己实例化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来确定DB使用。

一个字的警告虽然 - 如果你打算使用这种方法,那么我会建议不使用直接传入的值。对有限列表使用某种验证会更好,这样人们不能只查询任何数据库(如果他们知道他们的名字)。

希望这是有道理的:)

+0

感谢您的回复。你对ContentProvider实例化的方式是正确的,它的全部“自动”,这就是为什么我没有控制在SQLiteOpenHelper级别。我不认为你的第二个建议会起作用,因为我需要在设备上有多个相同结构的数据库,并且用户需要能够在运行时间之间进行切换,另外我不知道他们会提前调用什么。你的第一个建议听起来不错,我试图实现它,但是我的Java技能并不合格,你会怎么做? – stevekiwi

1

首先,让我说,我已经看了很多在网络上ContentProvider的代码,并且结束了一个例子帮助我最是这一个:

http://mobile.tutsplus.com/tutorials/android/android-sdk_content-providers/

我有一个非常类似的情况到你,在这里我想有一个包含车辆的燃油里程数的数据不同名称的数据库。每个名称都由一个车辆名称(由用户指定)和当前年份组成,并加上固定文本“fuel_data”以使数据库文件名易于读取。

与我发现的所有示例不同,我不在ContentProvider的onCreate方法中创建数据库实例。这是因为我现在还不知道车辆名称,这要感谢我编写代码的方式(以及事件ContentProvider在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)); 
}`