如何使用数据库创建Android单例和自定义数据类?

如何使用数据库创建Android单例和自定义数据类?,android,sqlite,Android,Sqlite,我想使用单例模式为我的Android应用程序保存一个数据库和一些其他数据/方法 我意识到有很多反对单身的理由,但在这个例子中,我想使用它 我对UIApplication进行了子分类,并在其中创建了一个名为MyAppData的数据类 MyAppData需要访问SQLite数据库 当我创建数据库时,我需要传递一个上下文。我可以传递应用程序上下文,但它不会直接与MyAppData相关 我不知道这是否会导致我的代码出现问题 所以我的想法是让MyAppdata扩展android.content.Conte

我想使用单例模式为我的Android应用程序保存一个数据库和一些其他数据/方法

我意识到有很多反对单身的理由,但在这个例子中,我想使用它

我对UIApplication进行了子分类,并在其中创建了一个名为MyAppData的数据类

MyAppData需要访问SQLite数据库

当我创建数据库时,我需要传递一个上下文。我可以传递应用程序上下文,但它不会直接与MyAppData相关

我不知道这是否会导致我的代码出现问题

所以我的想法是让MyAppdata扩展android.content.ContextWrapper。我认为我不应该扩展Activity,因为它实际上不是一个Activity,而是一个数据类,包含访问数据库的方法

我想知道我是否扩展了ContextWrapper,在我丢失的代码中是否会有一些深层次的东西,这些东西会导致以后的大问题(内存泄漏等)

这可能不是实现这一目标的理想方法(我也考虑过其他选择),但我的目标是:

在UIApplication中有一个singleton类,它可以封装数据库,并且可以轻松地从我的应用程序中的任何活动中检索


提前感谢您的建议/警告/建议。

我使用了以下方法:

创建一个负责管理数据库的类,我们称之为
DBUtil
。这个类将扩展android.database.sqlite.SQLiteOpenHelper。您可以将对应用程序上下文的引用传递给此类的构造函数。此类将包含用于创建数据库、添加、删除和检索项的方法

创建另一个类,我们称之为
AppCore
,创建
DBUtil
的静态实例和接受
ApplicationContext
对象的静态
init()
方法

public class AppCore
{
    public static var dbUtil:DBUtil;

    public static void init( ApplicationContext context )
    {
         dbUtil = new DBUtil( context );
    }
}
然后在应用程序的主
活动
的onCreate()方法中,初始化
AppCore

@Override
protected void onCreate(Bundle savedInstanceState) 
{
     AppCore.init( getApplicationContext() );   
}
所以,它不是一个真正的单身汉。相反,DBUtil实例作为静态属性进行维护,但在整个应用程序中仍然可以访问,例如:

AppCore.dbUtil.createNewRecord( params );

此外,我发现本教程在开始学习本主题时非常有用:

子类
android.database.sqlite.SQLiteOpenHelper
android.app.Application
(后者在
AndroidManifest.xml
中正确声明)。
现在,

然后拥有将执行指令/更新等的助手DAO类。

这就是我在所有应用程序中使用的方法。

感谢您提供的提示和示例代码,但我想问一下,与我正在考虑的方法相比,这种方法是否有优点/缺点?它似乎消除了单例,但正如我前面提到的,如果可能的话,我想坚持这样做(除非我错过了一些非常重要的东西,这会改变我的想法)。这只是我首选的方法。我在多个项目中使用过它,效果很好。我建议扩展SQLiteOpenHelper,因为它有一些方便的挂钩。我建议从应用程序类设置应用程序上下文,这样即使您从不同的活动启动应用程序(就像其他应用程序一样),它也能保证工作。我使用了类似的方法,但后来阅读了此方法。我意识到这是一个旧的答案,但如果您仍然记得的话;在哪里关闭从getDB()返回的SQLiteDatabase?每次使用后?或者,当应用程序终止时,是否有某种方法可以关闭它?我知道在应用程序中有一个onTerminate方法,但显然在生产设备上没有调用它。
public class MyApplication extends Application {

    private static SQLiteOpenHelper openHelper;

    @Override
    public void onCreate() {
        super.onCreate();
        openHelper = new DbManager(this);
        //
    }

    public static SQLiteDatabase getDB() {
        return openHelper.getWritableDatabase();
    }
}