如何使用数据库创建Android单例和自定义数据类?
我想使用单例模式为我的Android应用程序保存一个数据库和一些其他数据/方法 我意识到有很多反对单身的理由,但在这个例子中,我想使用它 我对UIApplication进行了子分类,并在其中创建了一个名为MyAppData的数据类 MyAppData需要访问SQLite数据库 当我创建数据库时,我需要传递一个上下文。我可以传递应用程序上下文,但它不会直接与MyAppData相关 我不知道这是否会导致我的代码出现问题 所以我的想法是让MyAppdata扩展android.content.ContextWrapper。我认为我不应该扩展Activity,因为它实际上不是一个Activity,而是一个数据类,包含访问数据库的方法 我想知道我是否扩展了ContextWrapper,在我丢失的代码中是否会有一些深层次的东西,这些东西会导致以后的大问题(内存泄漏等) 这可能不是实现这一目标的理想方法(我也考虑过其他选择),但我的目标是: 在UIApplication中有一个singleton类,它可以封装数据库,并且可以轻松地从我的应用程序中的任何活动中检索如何使用数据库创建Android单例和自定义数据类?,android,sqlite,Android,Sqlite,我想使用单例模式为我的Android应用程序保存一个数据库和一些其他数据/方法 我意识到有很多反对单身的理由,但在这个例子中,我想使用它 我对UIApplication进行了子分类,并在其中创建了一个名为MyAppData的数据类 MyAppData需要访问SQLite数据库 当我创建数据库时,我需要传递一个上下文。我可以传递应用程序上下文,但它不会直接与MyAppData相关 我不知道这是否会导致我的代码出现问题 所以我的想法是让MyAppdata扩展android.content.Conte
提前感谢您的建议/警告/建议。我使用了以下方法: 创建一个负责管理数据库的类,我们称之为
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();
}
}