gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 20:46:09 25 4
gpt4 key购买 nike

是否可以将 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com