在SQLiteOpenHelper的onCreate()中设置SQLite的初始值

时间:2014-10-04 18:27:48

标签: android performance sqlite sqliteopenhelper

我正在创建一个Android应用,我需要创建一个SQLite数据库并使用一些值预先填充它。

Android文档说明了如何在SQLiteOpenHelper的“onCreate”中执行操作:

  

首次创建数据库时调用。这是表的创建和表的初始填充的地方。

参考 - http://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html#onCreate(android.database.sqlite.SQLiteDatabase)

我怀疑以下两件事 -

  • “首次创建数据库时”的含义是什么?这是在第一次启动应用程序时完成,还是仅在第一次DB请求(读/写等)完成时完成。

    如果是后者,我担心创建DB可能需要相当长的时间,用值预先填充它(我有大约60行要插入到1个表中),然后读取数据库以显示它。这是最佳做法吗?

  • 我一直在AsyncTasks中执行所有数据库操作。但我正在使用“db.execSQL”语句在onCreate中创建表创建。这是好的(在约定/性能方面)还是我应该在这里寻找AsyncTask?

感谢任何帮助。

3 个答案:

答案 0 :(得分:1)

1)后来。它是在第一次读取或写入DB时完成的。

您的恐惧可能是正确的,这就是您可以使用已填充的数据库发送应用程序的原因。或者,您可以使用简单的SELECT 1 FROM anytable查询启动AsyncTask。有关使用数据库here发货的详情。 (60行没什么可担心的,你可以安全地继续使用AsyncTasks)。

2)是的,没关系。 onCreate逻辑将在您第一次读/写DB时运行,因此如果您始终使用AsyncTasks onCreate也将在AsyncTask中运行。

答案 1 :(得分:0)

“第一次创建数据库时”的含义是什么?这是在第一次启动应用程序时完成,还是仅在第一次DB请求(读/写等)完成时完成。

  • 当你第一次从数据库中查询时会发生这种情况。之后,当您更改db版本时,也只调用Upgrade方法。

如果是后者,我担心创建DB可能需要相当长的时间,用值预先填充它(我有大约60行要插入到1个表中),然后读取数据库以显示它。这是最好的做法吗?

  • 60行插入不是一项大任务。您可以阅读有关beginTransaction(),commitTransaction和endTransaction以进行插入的更多信息。它将使您的插入任务快速点亮。

我一直在AsyncTasks中执行所有数据库操作。但我正在使用“db.execSQL”语句在onCreate中创建表创建。这是好的(在约定/性能方面)还是我应该在这里寻找AsyncTask?

  • 你在AsyncTask中做Db操作很好,而且完全没问题。

答案 2 :(得分:0)

说到数据库操作:

通常,在AsyncTask中执行数据库操作不是一个好方法。因为你可能会遇到一个叫做“内存泄漏”的问题,它可能会在夜晚成为一个沉默的刺客。

关于这个问题已经写了很多。只需谷歌“asynctask泄漏上下文”,你就去了。

那么如何执行数据库操作?

Loader APIContentProvider结合使用会被视为查询数据库的好方法Loader异步查询数据库并将结果传递给指定的订阅者。配置更改或其他突发事件不会打扰它。

一旦您知道如何使用加载程序API查询数据,非常方便

单个插入/更新/删除可以直接从主线程通过ContentResolver完成。这些调用将是阻塞(同步),但我敢打赌,当数据量不大时,用户永远不会注意到任何事情。

如果您正在操作大型数据集,并且您担心会严重阻止UI线程,我建议使用IntentService或任何能够在后台执行操作的自定义服务( < em> note 默认情况下Service在主UI线程上运行,您必须自己指定后台​​操作或使用IntentService

说到数据库初始化

如果您要初始化大量数据,则可以创建一次性IntentService。它将异步处理您的请求,例如,执行应用程序已设置并准备就绪的广播,因此您可以停止“等待一秒,执行应用程序初始化”屏幕并向用户显示您的数据

将数据库与应用程序一起发送也没有任何问题,尽管它似乎是一个有点破解的解决方案。

无论哪种方式,您都可以选择更适合您的方式。