android – 数据库全局实例

所以我希望为所有应用程序活动都有一个数据库实例.
我找到了以下代码
public class MyApplication extends Application {

    private static sqliteDatabase mDB = null;

    @Override
    public void onCreate() {
        super.onCreate();
    DataBaSEOpenHelper m_OpenHelper = new DataBaSEOpenHelper( this );
    mDB = m_OpenHelper.getWritableDatabase();
    }

    public static sqliteDatabase getDB() {
        return mDB;
    }
}

我什么时候可以关闭sqliteDatabase实例,我不明白.

解决方法

当我刚开始使用Android时,这对我来说是一个问题,因为网上没有很多教程描述如何正确地允许在整个应用程序中访问您的数据库(不要问我原因).这里有一些展示三种可能方法的示例代码.

方法#1:继承`Application`

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

public class MainApplication extends Application {

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

    /**
     * create the database helper when the application is launched 
     */
    @Override
    public void onCreate() {
        mDbHelper = new DataDbAdapter(this);
        mDbHelper.open();
    }

    /** 
     * close the database helper when the application terminates.
     */
    @Override
    public void onTerminate() {
        mDbHelper.close();
        mDbHelper = null;
    }

    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数据库帮助程序.只需从Activity中调用getContentResolver(),系统就会为您处理所有事情(换句话说,不需要设计Singleton模式来防止创建多个实例).

希望有所帮助!

相关文章

以下为个人理解,如错请评 CE: 凭据加密 (CE) 存储空间, 实际路径/data/user_ce/ DE: 设备加密 (DE) 存...
转载来源:https://blog.csdn.net/yfbdxz/article/details/114702144 用EventLog.writeEvent打的日志(或...
事件分发机制详解 一、基础知识介绍 1、经常用的事件有:MotionEvent.ACTION_DOWN,MotionEvent.ACTION...
又是好久没有写博客了,一直都比较忙,最近终于有时间沉淀和整理一下最近学到和解决的一些问题。 最近进...
Android性能优化——之控件的优化 前面讲了图像的优化,接下来分享一下控件的性能优化,这里主要是面向...
android的开源库是用来在android上显示gif图片的。我在网上查了一下,大家说这个框架写的不错,加载大的...