Android数据库实例类

时间:2012-09-29 07:04:09

标签: android database sqlite

我需要一些建议如何在Android和Java中实现。我有一个包含50多个活动的大项目,我使用两个不同的数据库类来查询sqlite语句并从我的系统和用户数据库中检索信息。以下是我使用和初始化数据库的示例:

SystemDatabaseHelper dbHelper = new SystemDatabaseHelper(this, null, 1);
dbHelper.initialize(this);

我在活动中这样做,最近几天我读了大量关于android中的内存泄漏以及关于将Context提供给非活动类的全部信息以及这可能导致的泄漏。我的问题是哪个是创建某个类并仅从主要活动初始化它的最佳方法,而不是在所有其他活动中使用它而不是一次又一次地初始化它。

任何建议都是实现这一目标的最佳方式......我有一些想法,但希望听到您的建议和最佳实践。

2 个答案:

答案 0 :(得分:2)

如果您只是在寻找单身人士时尝试初始化数据库帮助程序类?这是一个如何制作它的例子

public class ContactDBHelper extends SQLiteOpenHelper {

    private ContactDBHelper(Context context, String name,
            CursorFactory factory, int version) {
        super(context, name, factory, version);

    }

    private static ContactDBHelper mInstance;

    public static synchronized ContactDBHelper getInstance() {

        if (mInstance == null) {
            mInstance = new ContactDBHelper(Util.getApplicationContext(),
                    ContactDB.DB_NAME, null, ContactDB.DB_VERSION);
        }
        return mInstance;
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(ContactDB.Contact.CREATE_STMT);
        db.execSQL(ContactDB.Contact.CREATE_PHONE_NUMBER_INDEX);
        db.execSQL(ContactDB.Contact.CREATE_REVERSE_PHONE_NUMBER_INDEX);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        // TODO Auto-generated method stub

    }

    @Override
    protected Object clone() throws CloneNotSupportedException {

        throw new CloneNotSupportedException();
    }

}

如果你第一次调用ContactDBHelper.getInstance();,它会初始化实例,之后任何应用程序组件或任何方法都会调用它,它不会初始化它将返回单例初始化实例。  注意:对于Util.getApplicationContext,它是一个静态帮助器方法,它返回在主Activity中设置的应用程序上下文。

对于内存泄漏,您可以使用WeakReferenceSoftRerference

来避免或保护您的应用。

这是Util类

public class Util {

    private static WeakReference<Context> applicationContext;

    public static Context getApplicationContext() {
        return applicationContext.get();
    }

    public static void setApplicationContext(Context context) {
        applicationContext = new WeakReference<Context>(context);
    }
}

答案 1 :(得分:1)

您可以扩展应用程序类并使用单个全局引用。这也具有不使用Activity上下文的优点。

public class NameOfApp extends Application {  

    public static SQLiteDatabase db;

    @Override
    public void onCreate() {

          super.onCreate();

          try{

               // this will create the database if required (e.g. new install or db deleted)
               db=new Database(this.getBaseContext()).getWritableDatabase();        

          } catch (Exception e) {

               // TODO add alert and quit
               Log.e(TAG,"Error creating DB:" + e.getMessage());
               Toast.makeText(getApplicationContext(), "Error creating DB:" + e.getMessage(), Toast.LENGTH_LONG).show();

        }

    } // onCreate

    @Override
    public void onTerminate(){
         Log.d(TAG, "Application.onTerminate() database closed");
         super.onTerminate();
         savePreferences();
         db.close();
    }

    public void closeDB(){
          db.close();
          Log.d(TAG,"Database closed on request");
    }

    protected SQLiteDatabase getwritableDatabase(){
        return db;
    }

}

使用MyAppName.getWritableDatabase()。