我正在使用三项同时开放的活动。所有活动都是从sqlite中提取的数据。当我离开活动a->b或b->c时,我不会关闭或重新打开我的连接。当活动正在破坏时,我只是释放我的db。
活动A
SqliteConnection db;
OnCreate method
db = new SqliteConnection(mypath);
OnDestroy
db.Dispose();
db=null;
Onbuttonclick
startActivity(new Intent(this, ActivityB));当我从活动b->c运行相同的代码时,在相同的活动中,我多次使用sqlite。
这是个好做法吗?我应该在使用后立即处理连接吗?或者我应该在暂停时关闭连接,在简历上重新打开?或者我可以将相同打开的连接传递到下一个活动?哪一种是最好的方法?
问题修正
class databaseHelper
{
private static SqliteConnection db;
public static SqliteConnection openDatabase(Context context)
{
if(db==null)
db = new SqliteConnection(mypath);
return db;
}
}在我的创作活动中
databaseHelper.openDatabase(this).myquery....发布于 2019-04-28 08:08:46
我既不跟爪哇,也不跟扎马林打交道。这是一个Kotlin代码,它是相当不言自明的。
class DatabaseHelper { //Public class
companion object { ///This is equiavalent to java static.
private var instance: YourDatabase? = null
fun getDbInstance(context: Context): YourDatabase? //This functions returns the initialized DB instance.
{
if(instance == null)
instance = YourDatabase(context) // initializing the DB only one time
return instance
}
}
}只需创建一个公共类并将其命名为"DatabaseHelper“。在类中,创建一个数据库类型的静态变量。创建一个返回静态变量的公共函数。在函数中,首先检查静态实例是否为空,如果为空,然后使用数据库实例初始化它。这样,当您需要使用数据库实例时,只需访问静态函数,为其提供上下文,它将返回初始化的数据库实例。
In Kotlin
DatabaseHelper.getDbInstance(this).yourDbFunction()更新
既然这个答案已经提出,我想对我以前的解决办法提出改进意见。不要传递活动的上下文来初始化数据库,而是使用应用程序上下文。如果将活动上下文提供给静态数据库实例,则会发生内存泄漏,因为数据库实例包含对该活动的强引用,而该活动将不符合垃圾收集的条件。
正确使用:
val myDb = MyDb(applicationContext)发布于 2019-04-28 08:15:18
通常,我们应该将对本地存储的访问封装在另一个类中,比如DAO/Repository/Service,而不是将它们直接放在活动中。这将促进视图与数据/网络访问之间的松散耦合。这也使您的DB连接的生命周期与当前正在运行的活动的生命周期脱钩,为您提供了更多的控制和重用的机会。
尝试使用绑定服务,并使您的DB连接在那里。因为它是绑定服务,所以只有在绑定到它的活动周围时,它才会出现。每个活动都将绑定到服务的同一个实例,因此这意味着您不会有重复的连接。当没有任何活动绑定到它时,它将自动被销毁,并与它一起破坏连接。
对于一种更现代的结构化方法,使用Jetpack组件,可以查看https://github.com/googlesamples/android-sunflower
https://stackoverflow.com/questions/55888179
复制相似问题