首页 > 解决方案 > Android创建DatabaseAccess类的正确方法

问题描述

我有以下 DatabaseAccess.java 类,其中包含以下代码,以便实例化、打开、关闭和一些查询:

public class DatabaseAccess {
Context context;
private SQLiteOpenHelper openHelper;
private SQLiteDatabase database;
private static DatabaseAccess instance;

/**
 * Private constructor to avoid object creation from outside classes.
 *
 * @param context
 */
private DatabaseAccess(Context context) {
    this.context = context;
    this.openHelper = new DatabaseHelper(context);
}

/**
 * Return a singleton instance of DatabaseAccess.
 *
 * @param context the Context
 * @return the instance of DabaseAccess
 */
public static DatabaseAccess getInstance(Context context) {
    if (instance == null) {
        instance = new DatabaseAccess(context);
    }
    return instance;
}

/**
 * Open the database connection.
 */
public void open() {
    this.database = openHelper.getWritableDatabase();
}

/**
 * Close the database connection.
 */
public void close() {
    if (database != null) {
        this.database.close();
    }
} 

但是,我收到了一个严重的 SONAR 警告:

在此处输入图像描述

不要将 Android 上下文类放在静态字段中(对具有指向 Context 的字段上下文的 DatabaseAccess 的静态引用);这是内存泄漏

在我的应用程序中,每次我需要使用 databaseAccess 实例时,我都会在 onViewCreated() 上执行以下操作

  @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    databaseAccess = DatabaseAccess.getInstance(getContext());
}

我真的很困惑,我该如何解决这个内存泄漏?

标签: androiddatabaseandroid-sqlitedatabase-connectionandroid-sql

解决方案


首先像这样为您的项目创建一个应用程序类。

<application android:name="com.xyz.YourApplicataionClassName">

</application>

然后在这个应用程序类中,为您的上下文创建一个静态 getter 方法。在需要上下文的地方调用此方法。

public class YourApplicataionClassName extends Application {

    private static Context context;

    public void onCreate() {
        super.onCreate();
        YourApplicataionClassName.context = getApplicationContext();
    }

    public static Context getAppContext() {
        return YourApplicataionClassName.context;
    }
}

调用 YourApplicataionClassName.getAppContext() 方法,这将返回您的上下文。

但是,使用房间持久性库是比执行所有这些操作更好的方法


推荐阅读