我正在创建一个Android应用,我需要创建一个SQLite数据库并使用一些值预先填充它。
Android文档说明了如何在SQLiteOpenHelper的“onCreate”中执行操作:
首次创建数据库时调用。这是表的创建和表的初始填充的地方。
我怀疑以下两件事 -
“首次创建数据库时”的含义是什么?这是在第一次启动应用程序时完成,还是仅在第一次DB请求(读/写等)完成时完成。
如果是后者,我担心创建DB可能需要相当长的时间,用值预先填充它(我有大约60行要插入到1个表中),然后读取数据库以显示它。这是最佳做法吗?
我一直在AsyncTasks中执行所有数据库操作。但我正在使用“db.execSQL”语句在onCreate中创建表创建。这是好的(在约定/性能方面)还是我应该在这里寻找AsyncTask?
感谢任何帮助。
答案 0 :(得分:1)
1)后来。它是在第一次读取或写入DB时完成的。
您的恐惧可能是正确的,这就是您可以使用已填充的数据库发送应用程序的原因。或者,您可以使用简单的SELECT 1 FROM anytable
查询启动AsyncTask。有关使用数据库here发货的详情。 (60行没什么可担心的,你可以安全地继续使用AsyncTasks)。
2)是的,没关系。 onCreate逻辑将在您第一次读/写DB时运行,因此如果您始终使用AsyncTasks onCreate也将在AsyncTask中运行。
答案 1 :(得分:0)
“第一次创建数据库时”的含义是什么?这是在第一次启动应用程序时完成,还是仅在第一次DB请求(读/写等)完成时完成。
如果是后者,我担心创建DB可能需要相当长的时间,用值预先填充它(我有大约60行要插入到1个表中),然后读取数据库以显示它。这是最好的做法吗?
我一直在AsyncTasks中执行所有数据库操作。但我正在使用“db.execSQL”语句在onCreate中创建表创建。这是好的(在约定/性能方面)还是我应该在这里寻找AsyncTask?
答案 2 :(得分:0)
通常,在AsyncTask
中执行数据库操作不是一个好方法。因为你可能会遇到一个叫做“内存泄漏”的问题,它可能会在夜晚成为一个沉默的刺客。
关于这个问题已经写了很多。只需谷歌“asynctask泄漏上下文”,你就去了。
将Loader API
与ContentProvider
结合使用会被视为查询数据库的好方法。 Loader
异步查询数据库并将结果传递给指定的订阅者。配置更改或其他突发事件不会打扰它。
一旦您知道如何使用加载程序API查询数据,非常方便。
单个插入/更新/删除可以直接从主线程通过ContentResolver
完成。这些调用将是阻塞(同步),但我敢打赌,当数据量不大时,用户永远不会注意到任何事情。
如果您正在操作大型数据集,并且您担心会严重阻止UI线程,我建议使用IntentService
或任何能够在后台执行操作的自定义服务( < em> note 默认情况下Service
在主UI线程上运行,您必须自己指定后台操作或使用IntentService
)
如果您要初始化大量数据,则可以创建一次性IntentService
。它将异步处理您的请求,例如,执行应用程序已设置并准备就绪的广播,因此您可以停止“等待一秒,执行应用程序初始化”屏幕并向用户显示您的数据
将数据库与应用程序一起发送也没有任何问题,尽管它似乎是一个有点破解的解决方案。
无论哪种方式,您都可以选择更适合您的方式。