在Android上正确使用SQLite(SQLiteOpenHelper,连接,主线程等...)

14
我正在搜索有关Android上SQLite的信息,并阅读一些Android编程书籍的章节,但我不知道如何正确地在Android上使用SQLite。我正在开发一个具有活动、服务和广播接收器的应用程序,所有这些组件都必须读取和写入数据库。因此,我有一些问题:
1.创建SQLiteOpenHelper实例的最佳位置在哪里?我已经阅读了相关信息,似乎最好的方法是为整个应用程序只创建一个SQLiteOpenHelper。
2.什么时候,在哪里需要通过调用dbHelper.getReadableDatabase()(或getWritableDatabase)获取SQLiteDatabase对象?每次查询都需要在每次查询后关闭它吗?
3.我读到说我不应该在主线程中执行数据库操作,所以我正在为我在Activity中进行的每个数据库操作创建异步任务,这是最好的方法吗?

感谢您的负面投票 ¬¬ - Sergio Viudes
2
创建SQLiteOpenHelper实例的最佳位置是在ContentProvideronCreate方法中...使用getWritableDatabase()的最佳位置是在ContentProviderdelete/insert/update方法中,而getReadableDatabase()的最佳位置则在query方法中...你不需要关闭这些数据库...为了避免在UI上使用数据库操作,可以使用带CP的Loaders...我知道编写CP很痛苦,但是如果编写得好,可以避免许多问题(例如从多个线程访问数据库)。 - Selvin
谢谢Selvin。我想在不使用ContentProvider的情况下使用SQLite,因为我不需要与其他应用程序共享任何数据。我读到了一篇文章,说我的应用程序中不需要内容提供程序:http://touchlabblog.tumblr.com/post/32793099735/training-sqlite#_=_. 没有办法在不使用ContentProvider的情况下正确地使用SQLite吗? - Sergio Viudes
1
但是为什么你不想在这种情况下使用CP呢?(多个应用程序组件(Activity、Ser、BR))使用CP还有另一个附加值...如果你在服务中插入了一些内容,你的带有fx ListView的Activity将会得到通知并重新加载项目...无论如何,你可以尝试将数据库访问方法放在自定义Application类中。 - Selvin
好的Selvin,我会看一下CP。如果使用它可以使我的应用程序正常工作,我会使用它。谢谢 :) - Sergio Viudes
2个回答

7

大多数问题本质上都是主观的。但是让我试着回答一下

在哪里创建SQLiteOpenHelper实例最好?我阅读了相关内容,似乎最好的方法是为整个应用程序只创建一个SQLiteOpenHelper。

您可以在项目中创建一个继承SQLiteOpenHelper的类。当您需要在应用程序的多个活动中访问相同的数据库时,这非常有用。

何时、在哪里通过调用dbHelper.getReadableDatabase()(或getWritableDatabase)获取SQLiteDatabase对象?我需要在每次查询时都这样做,每次查询后关闭它吗?

这将在继承SQLiteOpenHelper的类中完成。例如:(这是来自Vogella文章的摘录,该文章在本文末尾提供)

public void open() throws SQLException {
    database = dbHelper.getWritableDatabase();
}

在将使用该类的活动中:

CommentsDataSource datasource = new CommentsDataSource(this);
datasource.open();

当您完成了使用 Database 进行获取、修改、添加等操作后,应关闭从 Activity 创建的 CursorDatabase 连接。尽量不要在主线程中进行数据库操作,最好为您在 Activity 中进行的每个数据库操作创建一个异步任务,在处理大型记录集时特别建议使用异步任务。最后,我建议您阅读 Lars Vogella 的这篇教程:http://www.vogella.com/articles/AndroidSQLite/article.html,它将解答大多数您的疑问和问题,祝你好运。 :-)

谢谢IceMAN!你的回答和Vogella的文章对我帮助很大! - Sergio Viudes
@SergioViudes:不客气。他还有其他很好的教程,我仍然觉得非常有帮助。我相信你也会这样。 :-) - Siddharth Lele

0

1.在哪里创建SQLiteOpenHelper实例最好?

SQLiteOpenHelper帮助您连接使用它定义的表。因此,您可以在一个SQLiteOpenHelper类中定义所有表。

2.何时以及在哪里通过调用dbHelper.getReadableDatabase()(或getWritableDatabase)获取SQLiteDatabase对象?

每当您想要写入您定义的表中的数据时,您将需要调用getWritableDatabase,而对于从中读取数据,您将需要getReadableDatabase

您可以为这些目的制作CRUD(创建、检索、更新、删除)函数。

3.永远不要在主线程中进行数据库操作!

我不确定这一点。

好吧,这里有一个链接供您开始使用SQLite- http://www.androidhive.info/2011/11/android-sqlite-database-tutorial/


谢谢你的回答。关于SQLiteOpenHelper,我知道它是什么,事实上,我已经使用它了,并且我的应用程序正在使用我的SQLite数据库工作,但是我需要创建多个SQLiteOpenHelper,因为仅使用一个来从不同的线程访问数据库会导致我的应用程序失败。我阅读到应该只创建1个(http://touchlabblog.tumblr.com/post/32793099735/training-sqlite#_=_),所以我不需要确切地知道如何处理它。关于getReadableDatabase/getWritableDatabase,我像你的教程一样操作:打开连接->查询->关闭连接。 - Sergio Viudes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接