我有很多数据存储在CSV文件中(大约20,100行),我需要将其插入到sqlite数据库中。
此插件需要很长时间才能完成。插入此数据的最快方法是什么?
答案 0 :(得分:2)
正如您所建议的那样,行数很大我建议不要使用AsyncTask
,因为它与您的Activity生命周期无关,即如果您启动它的活动死亡,则不表示AsyncTask
也就是死了,所以如果你尝试启动一个AsyncTask,并且如果你的活动死了,例如屏幕旋转或后退键被按下,重新启动时,另一个AsyncTask
将被生成而不是它已经链接到已经执行AsyncTask
。因此重复相同的操作。
所以,总而言之,我建议采用以下方法
(A)
创建一个IntentService
,它的handleIntent()
api已在工作线程中执行,因此您不必担心任何事情,并且一旦其队列中的所有消息都自动完成它死了,所以不用担心泄漏任何资源。
编写用于批量插入行的逻辑,使用内容解析器bulkInsert()api。我建议每批插入100个roes,你可以实现回滚和错误检查,以确保插入正常。
完成所有插入后,您可以使用处理程序和信使回发到您的UI。
有了这一切,你将实现两大挑战
答案 1 :(得分:0)
使用AsyncTask<>
,在数据库中插入20,100
行。使用此asynctask整个工作在后台运行。有关更多信息,请参阅this link
答案 2 :(得分:0)
最好的解决方案是使用服务和执行程序,因为正如OP所描述的那样,进程可能需要很长时间。感谢您将能够关闭应用程序或将其移动到后台而不用担心您的漫长过程被破坏。
使用AsyncTask不是一个好主意,因为它是为http://developer.android.com/reference/android/os/AsyncTask.html上描述的简短操作而设计的。您还必须小心使用它。更改方向屏幕会导致重新创建视图以及asynctask的任务。
理想情况下,AsyncTasks应该用于短时间操作(几秒钟) 最多。)如果你需要保持线程长时间运行 时间,强烈建议您使用提供的各种API java.util.concurrent包,例如Executor,ThreadPoolExecutor 和FutureTask。