Android 在SQLiteOpenHelper的onCreate()中设置SQLite的初始值
我正在创建一个Android应用程序,我需要为它创建一个SQLite DB并用一些值预先填充它 Android文档说明了如何在SQLiteOpenHelper的“onCreate”中执行以下操作: 第一次创建数据库时调用。这是创建表和初始填充表的地方 参考- 我对以下两件事表示怀疑-Android 在SQLiteOpenHelper的onCreate()中设置SQLite的初始值,android,performance,sqlite,sqliteopenhelper,Android,Performance,Sqlite,Sqliteopenhelper,我正在创建一个Android应用程序,我需要为它创建一个SQLite DB并用一些值预先填充它 Android文档说明了如何在SQLiteOpenHelper的“onCreate”中执行以下操作: 第一次创建数据库时调用。这是创建表和初始填充表的地方 参考- 我对以下两件事表示怀疑- “首次创建数据库时”是什么意思?这是在第一次启动应用程序时完成的,还是仅在第一次DB请求(读/写等)完成时完成的 如果是后者,我担心可能需要相当长的时间来创建DB,用值预先填充它(我有大约60行要插入到一个表中)
- “首次创建数据库时”是什么意思?这是在第一次启动应用程序时完成的,还是仅在第一次DB请求(读/写等)完成时完成的 如果是后者,我担心可能需要相当长的时间来创建DB,用值预先填充它(我有大约60行要插入到一个表中),然后读取DB来显示它。这是最好的做法吗
- 我一直在异步任务中执行我的所有DB操作。但是我在onCreate中使用“db.execSQL”语句创建表。这很好(在约定/性能方面)还是我也应该在这里执行异步任务
select1 fromtanytable
查询启动一个异步任务。更多关于与DB一起发货的信息。(60行没有什么好担心的,您可以安全地继续使用AsyncTasks)
2) 是的,很好。onCreate逻辑将在您第一次读/写数据库时运行,因此,如果始终使用AsyncTasks,onCreate也将在AsyncTask中运行。什么是“首次创建数据库时”?这是在第一次启动应用程序时完成的,还是仅在第一次DB请求(读/写等)完成时完成的
- 一般来说,当您第一次从数据库查询时会发生这种情况。在此之后,当您更改db版本时,也会调用唯一的升级方法
- 60行插入不是一项大任务。您可以阅读更多关于beginTransaction()、commitTransaction和endTransaction for insertion的信息。这将使您的插入任务快速启动
- 很好,您正在AsyncTask中执行Db操作,而且完全没有问题
AsyncTask
中执行DB操作不是一个好方法。因为你可能会遇到一个叫做“内存泄漏”的问题,它可能会像一个沉默的刺客在夜间出现
关于这个问题有很多文章。只需谷歌“asynctask泄漏上下文”就可以了
那么如何执行数据库操作呢?
将Loader API
与ContentProvider
结合使用被认为是查询数据库的好方法Loader
异步查询数据库并将结果传递给指定的订阅服务器。配置更改或其他突然发生的事情不会影响它
一旦您知道如何使用loader API查询数据,就非常方便了
单次插入/更新/删除可以通过ContentResolver
从主线程直接完成。这些调用将被阻塞(同步),但我敢打赌,当数据量不大时,用户永远不会注意到任何东西
如果您在一个大数据集上操作,并且担心会严重阻塞UI线程,我建议使用IntentService
或任何能够在后台执行操作的自定义服务(注意默认情况下,服务
在主UI线程上运行,您必须自己指定后台操作或使用IntentService
)
说到数据库初始化:
如果您正在初始化一大组数据,您可能会创建一个一次性的IntentService
。它将异步处理您的请求,例如,执行广播,说明应用程序已设置就绪,因此您可能会停止“等待一秒,执行应用程序初始化”屏幕,并向用户显示您的数据
将数据库和应用程序一起提供也没什么错,尽管这似乎是一个有点粗俗的解决方案
无论哪种方式,您都可以选择更适合您的方式。“当首次创建数据库时”是什么意思?这是在首次启动应用程序时完成的,还是仅在完成第一个数据库请求(读/写等)时完成的。”--这是在您调用
getReadableDatabase()
或getWriteableDatabase()时完成的
在SQLiteOpenHelper
上,数据库文件不存在。好的..但在这种情况下,这不会影响性能吗?或者,我应该在应用程序中附带预填充的数据库吗?这似乎是一项相当棘手的任务,我想我希望避免它。“这不会影响性能吗?”--嗯,你必须在某个时候打开数据库。“或者,我应该在应用程序中附带一个预填充的数据库吗?”--哦,如果这是你的用例的一个选项,我肯定会这样做,”这似乎是一个相当棘手的任务,我想我会避免它“--没那么难,谢谢!我会尝试SQLITeAssetPeryes,我正在使用try finally括号中的beginTransaction()、setTransactionSuccessful()和endTransaction()进行数据库的初始填充。与AsyncTask(使用游标等)相比,这一过程如何