java - 对三个 Activity 使用相同的 sqlite

标签 java android xamarin

我正在使用同时打开的三个 Activity 。所有 Activity 都是从 sqlite 检索数据。当我从 Activity a->b 或从 b->c 进行操作时,我不会关闭或重新打开连接。 我只是在 Activity 破坏时处置我的数据库。

Activity A

SqliteConnection db;

OnCreate method
db = new SqliteConnection(mypath);

OnDestroy
db.Dispose();
db=null;

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

当我从 Activity b->c 开始时,正在运行相同的代码。 在同一个 Activity 中,我多次使用 sqlite。

这是一个好的做法吗?使用后我应该立即丢弃连接吗?或者我应该在暂停时关闭连接并在恢复时重新打开连接?或者我可以将相同的打开连接传递到下一个 Activity 吗?哪种方法最好?

问题已修改

class databaseHelper
{
      private static SqliteConnection db;

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

           return db;

   }

}

在我的创建 Activity 中

  databaseHelper.openDatabase(this).myquery....

最佳答案

我不使用 Java 也不使用 Xamarin。这是一段 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
    }

   }
}

只需创建一个公共(public)类并将其命名为“DatabaseHelper”。在该类中,创建一个数据库类型的静态变量。创建一个返回静态变量的公共(public)函数。在函数内部,首先检查静态实例是否为 null,如果为 null,则使用数据库实例对其进行初始化。这样,当您需要使用数据库实例时,只需访问静态函数,为其提供上下文,它就会返回初始化的数据库实例。

在 Kotlin 中

DatabaseHelper.getDbInstance(this).yourDbFunction()

更新

自从这个答案开始流行以来,我想对我之前的解决方案提出改进建议。使用应用程序上下文,而不是传递 Activity 上下文来初始化数据库。如果您为静态数据库实例提供 Activity 上下文,则会发生内存泄漏,因为数据库实例拥有对 Activity 的强引用,而 Activity 将 有资格进行垃圾收集。

正确使用:

val myDb = MyDb(applicationContext)

关于java - 对三个 Activity 使用相同的 sqlite,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55888179/

相关文章:

java - 字节顺序标记搞砸了 Java 中的文件读取

java - 如何检查数组列表是否包含不同的对象?

android - 使 fragment 布局周围的背景变暗

android - Solcalendar,与 Owncloud 同步

Xamarin:有没有办法将环境变量注入(inject)到 AndroidManifest.xml 文件中?

java - 找不到与给定名称匹配的资源,我哪里做错了?

java - 有没有办法让 eclipse 报告一般的 "catch (Exception e)"作为错误/警告(在 java 中)?

android - 向 Android 模拟器发送多点触控事件

c# - 无法从内容页面执行 PopAsync、PopModalAsync 和 PopToRootAsync

java - tomcat中PostgreSQL数据库的JNDI查找