java - 可以让 Android 应用程序中的所有 Activity 共享一个 SQLiteOpenHelper 实例吗?

标签 java android sqlite android-cursor android-loadermanager

是否可以将 SQLiteOpenHelper 的单个实例作为子类 Application 的成员,并让所有需要 SQLiteDatabase 实例的 Activity 从一个帮助器中获取它?

最佳答案

Click here to see my blog post on this subject.


CommonsWare 正常运行(像往常一样)。扩展他的帖子,这里有一些示例代码,说明了三种可能的方法。这些将允许在整个应用程序中访问数据库。

方法#1:继承`Application`

如果您知道您的应用程序不会很复杂(即,如果您知道您最终只会有一个 Application 的子类),那么您可以创建一个 Application 的子类并让您的主要 Activity 扩展它。这可确保数据库的一个实例在应用程序的整个生命周期中运行。

public class MainApplication extends Application {

    /**
     * see NotePad tutorial for an example implementation of DataDbAdapter
     */
    private static DataDbAdapter mDbHelper;

    /**
     * Called when the application is starting, before any other 
     * application objects have been created. Implementations 
     * should be as quick as possible...
     */
    @Override
    public void onCreate() {
        super.onCreate();
        mDbHelper = new DataDbAdapter(this);
        mDbHelper.open();
    }

    public static DataDbAdapter getDatabaseHelper() {
        return mDbHelper;
    }
}

方法 #2:让 `SQLiteOpenHelper` 成为静态数据成员

这不是完整的实现,但它应该让您了解如何设计 DatabaseHelper正确上课。静态工厂方法确保任何时候都只存在一个 DatabaseHelper 实例。

/**
 * create custom DatabaseHelper class that extends SQLiteOpenHelper
 */
public class DatabaseHelper extends SQLiteOpenHelper { 
    private static DatabaseHelper mInstance = null;

    private static final String DATABASE_NAME = "databaseName";
    private static final String DATABASE_TABLE = "tableName";
    private static final int DATABASE_VERSION = 1;

    private Context mCxt;

    public static DatabaseHelper getInstance(Context ctx) {
        /** 
         * use the application context as suggested by CommonsWare.
         * this will ensure that you dont accidentally leak an Activitys
         * context (see this article for more information: 
         * http://developer.android.com/resources/articles/avoiding-memory-leaks.html)
         */
        if (mInstance == null) {
            mInstance = new DatabaseHelper(ctx.getApplicationContext());
        }
        return mInstance;
    }

    /**
     * constructor should be private to prevent direct instantiation.
     * make call to static factory method "getInstance()" instead.
     */
    private DatabaseHelper(Context ctx) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        this.mCtx = ctx;
    }
}

方法 #3:使用 `ContentProvider` 抽象 SQLite 数据库

这是我建议的方法。一方面,新的 LoaderManager类在很大程度上依赖于 ContentProviders,所以如果你想要一个 Activity 或 Fragment 来实现 LoaderManager.LoaderCallbacks<Cursor> (我建议你利用它,它很神奇!),你需要实现一个 ContentProvider为您的应用程序。此外,您无需担心使用 ContentProviders 创建 Singleton 数据库助手。只需调用getContentResolver()从 Activity 开始,系统会为您处理所有事情(换句话说,无需设计单例模式来防止创建多个实例)。

希望有帮助!

关于java - 可以让 Android 应用程序中的所有 Activity 共享一个 SQLiteOpenHelper 实例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8888530/

相关文章:

java - 执行命令后客户端应用程序应采取什么操作?

java - 使用 JDBC 客户端获取 MySQL 时间数据类型的问题

java - 登录失败时如何在登录页面显示消息

java - 如何使用 Apache pdfbox 在 PDF 中生成多行

android - 启动设备时,我的启动器应用启动两次

python - 将数据从一个 sqlalchemy session 复制到另一个

android - 设置 TableRow 的背景颜色

android - Facebook Analytics 上的安装不同于 iTunes Connect 和 Google Play

c# - 如何在 .NET DLL 中嵌入 SQLite 数据库,然后从 C# 中使用它?

android - 网络.sqlcipher.database.SQLiteException : not an error: