0

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

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

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

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

4

2 回答 2

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 中设置的应用程序上下文。

WeakReference对于内存泄漏,您可以使用或避免或保护您的应用程序免受它的影响SoftRerference

这是 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);
    }
}
于 2012-09-29T07:19:11.440 回答
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()。

于 2012-09-29T07:22:46.393 回答