首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在三项活动中使用相同的sqlite

在三项活动中使用相同的sqlite
EN

Stack Overflow用户
提问于 2019-04-28 07:53:08
回答 2查看 161关注 0票数 2

我正在使用三项同时开放的活动。所有活动都是从sqlite中提取的数据。当我离开活动a->b或b->c时,我不会关闭或重新打开我的连接。当活动正在破坏时,我只是释放我的db。

活动A

代码语言:javascript
运行
复制
SqliteConnection db;

OnCreate method
db = new SqliteConnection(mypath);

OnDestroy
db.Dispose();
db=null;

Onbuttonclick
startActivity(new Intent(this, ActivityB));

当我从活动b->c运行相同的代码时,在相同的活动中,我多次使用sqlite。

这是个好做法吗?我应该在使用后立即处理连接吗?或者我应该在暂停时关闭连接,在简历上重新打开?或者我可以将相同打开的连接传递到下一个活动?哪一种是最好的方法?

问题修正

代码语言:javascript
运行
复制
class databaseHelper
{
      private static SqliteConnection db;

      public static SqliteConnection openDatabase(Context context)
   {
         if(db==null)
             db = new SqliteConnection(mypath);

           return db;

   }

}

在我的创作活动中

代码语言:javascript
运行
复制
  databaseHelper.openDatabase(this).myquery....
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-04-28 08:08:46

我既不跟爪哇,也不跟扎马林打交道。这是一个Kotlin代码,它是相当不言自明的。

代码语言:javascript
运行
复制
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

代码语言:javascript
运行
复制
DatabaseHelper.getDbInstance(this).yourDbFunction()

更新

既然这个答案已经提出,我想对我以前的解决办法提出改进意见。不要传递活动的上下文来初始化数据库,而是使用应用程序上下文。如果将活动上下文提供给静态数据库实例,则会发生内存泄漏,因为数据库实例包含对该活动的强引用,而该活动将不符合垃圾收集的条件。

正确使用:

代码语言:javascript
运行
复制
val myDb = MyDb(applicationContext)
票数 5
EN

Stack Overflow用户

发布于 2019-04-28 08:15:18

通常,我们应该将对本地存储的访问封装在另一个类中,比如DAO/Repository/Service,而不是将它们直接放在活动中。这将促进视图与数据/网络访问之间的松散耦合。这也使您的DB连接的生命周期与当前正在运行的活动的生命周期脱钩,为您提供了更多的控制和重用的机会。

尝试使用绑定服务,并使您的DB连接在那里。因为它是绑定服务,所以只有在绑定到它的活动周围时,它才会出现。每个活动都将绑定到服务的同一个实例,因此这意味着您不会有重复的连接。当没有任何活动绑定到它时,它将自动被销毁,并与它一起破坏连接。

对于一种更现代的结构化方法,使用Jetpack组件,可以查看https://github.com/googlesamples/android-sunflower

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55888179

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档