当单个数据库有多个Content Providers时,解决SQLiteOpenHelper的多个实例

时间:2013-07-03 07:44:18

标签: android android-contentprovider

在我的应用程序中,我为一个数据库实现了多个内容提供程序,每个表一个,因为有很多表,并且在单个内容提供程序中所有表的逻辑都会非常混乱。 / p>

我在这个链接中遵循了Simo给出的建议:

Content provider for multiple tables

因此,有一个抽象的AbsShopContentProvider,它有一个SQLiteOpenHelper成员变量。然后,此抽象内容提供程序由多个内容提供程序扩展,如Table1Provider,Table2Provider,...

所以现在每个Content Provider都有一个SQLiteOpenHelper实例。这会产生与线程安全有关的任何问题吗?

最好在我的抽象内容提供程序中将此SQLiteOpenhelper变量设置为“static”,并且只有在它为null时才在抽象提供程序的onCreate()中创建它的实例吗?它会解决拥有许多数据库帮助程序对象的问题吗?

1 个答案:

答案 0 :(得分:2)

您只需要确保共享一个SQLiteDatabase实例,SQLite会自动为同一个数据库锁定。

要使数据库全局可用,请扩展Application类:

public class App extends Application {
    private static SQLiteDatabase db;

    public static SQLiteDatabase getDb() {
        return db;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        db = new MySQLiteOpenHelper(getApplicationContext()).getWritableDatabase();
    }
}

并将其添加到清单:

<application
    android:name=".App"

现在,您可以通过调用App.getDb()

从任何活动/片段/服务访问数据库