在所有活动*享相同数据库的最佳方式
我正在使用我需要在所有活动中访问的数据库。所以,我创建了一个类MyDBAdapter与所有打开的方法,创建的getData等等在所有活动*享相同数据库的最佳方式
要访问DB我看到两种不同的方式:
一个。在每个活动中,我现在写:MyDBAdapter db = new MyDBAdapter();
这意味着每个活动都会创建一个新的DBAdapter。每个人都会打开相同的数据库并关闭它。这也意味着相同的数据库可能会被多个活动打开 - 是吗?或者,我是否每次切换活动时都要手动确保数据库已关闭?
或
b。在第一个活动中只创建一个DBAdapter实例,并每次将其传递给下一个活动使用putExtra("Task", x);
然后,数据库在第一个活动中只打开和关闭一次。
哪一个更好?
非常感谢。
一般来说,您必须关闭数据库,完成后使用它(手动调用db.close()
)。这意味着如果您在多个活动中使用数据库,则必须在完成使用后每次都关闭它。也就是说,如果您在每个活动中拨打电话MyDBAdapter db = new MyDBAdapter();
,则由您决定,否则您将对其进行静态引用。毕竟,如果在某些代码块中有一些局部变量MyDBAdapter db
,它将在某个时间点被垃圾收集。
另外一般来说,你不希望你的数据库操作在你的活动,因为这样他们将在UI线程上执行,阻止它,直到他们完成他们的数据库操作。您可能希望使用AsyncTask作为您的数据库操作,它将为数据库操作创建单独的线程(并为您处理它)。关于使用AsyncTasks,这里有一个很好的tutorial。
我会在每个onPause中做db.close()然后保存吗?也许有人会检查它是否已经关闭,如果不是关闭它 - 即使关闭它,即使它已经关闭了? – user387184
你可以在try-catch-finally块中使用构造if(db.isOpen()) - > db.close()。 – hovanessyan
我更喜欢content provider在活动*享数据。
即使其主要目的是在应用程序之间共享,它可以在我们的单个应用程序内使用。
如果我们使用内容提供者,不用担心db的关闭和锁定问题。
Content providersContent providers实现了查询提供者和返回结果的通用接口 - 以及添加,修改和删除数据。
它是客户端间接使用的接口,通常通过ContentResolver
对象使用。您可以通过调用getContentResolver()
谢谢 - 我将在下次考虑它 - 对于目前的应用程序,它只是太多的工作来改变所有的代码... – user387184
如果您不需要使用DB在不同的应用程序,但只有在你可以使用一个静态引用,而不是一个动态的同一应用程序的不同活动得到
ContentResolver
。 – andreapier