在所有活动*享相同数据库的最佳方式

问题描述:

我正在使用我需要在所有活动中访问的数据库。所以,我创建了一个类MyDBAdapter与所有打开的方法,创建的getData等等在所有活动*享相同数据库的最佳方式

要访问DB我看到两种不同的方式:

一个。在每个活动中,我现在写:MyDBAdapter db = new MyDBAdapter();

这意味着每个活动都会创建一个新的DBAdapter。每个人都会打开相同的数据库并关闭它。这也意味着相同的数据库可能会被多个活动打开 - 是吗?或者,我是否每次切换活动时都要手动确保数据库已关闭?

b。在第一个活动中只创建一个DBAdapter实例,并每次将其传递给下一个活动使用putExtra("Task", x);

然后,数据库在第一个活动中只打开和关闭一次。

哪一个更好?

非常感谢。

+0

如果您不需要使用DB在不同的应用程序,但只有在你可以使用一个静态引用,而不是一个动态的同一应用程序的不同活动得到ContentResolver。 – andreapier

一般来说,您必须关闭数据库,完成后使用它(手动调用db.close())。这意味着如果您在多个活动中使用数据库,则必须在完成使用后每次都关闭它。也就是说,如果您在每个活动中拨打电话MyDBAdapter db = new MyDBAdapter();,则由您决定,否则您将对其进行静态引用。毕竟,如果在某些代码块中有一些局部变量MyDBAdapter db,它将在某个时间点被垃圾收集。

另外一般来说,你不希望你的数据库操作在你的活动,因为这样他们将在UI线程上执行,阻止它,直到他们完成他们的数据库操作。您可能希望使用AsyncTask作为您的数据库操作,它将为数据库操作创建单独的线程(并为您处理它)。关于使用AsyncTasks,这里有一个很好的tutorial

+0

我会在每个onPause中做db.close()然后保存吗?也许有人会检查它是否已经关闭,如果不是关闭它 - 即使关闭它,即使它已经关闭了? – user387184

+0

你可以在try-catch-finally块中使用构造if(db.isOpen()) - > db.close()。 – hovanessyan

我更喜欢content provider在活动*享数据。
即使其主要目的是在应用程序之间共享,它可以在我们的单个应用程序内使用。
如果我们使用内容提供者,不用担心db的关闭和锁定问题。

Content providersContent providers实现了查询提供者和返回结果的通用接口 - 以及添加,修改和删除数据。

它是客户端间接使用的接口,通常通过ContentResolver对象使用。您可以通过调用getContentResolver()

入住这Simple Content Provider for db operations

+0

谢谢 - 我将在下次考虑它 - 对于目前的应用程序,它只是太多的工作来改变所有的代码... – user387184