Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在SQLiteOpenHelper的onCreate()中设置SQLite的初始值_Android_Performance_Sqlite_Sqliteopenhelper - Fatal编程技术网

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

Android 在SQLiteOpenHelper的onCreate()中设置SQLite的初始值,android,performance,sqlite,sqliteopenhelper,Android,Performance,Sqlite,Sqliteopenhelper,我正在创建一个Android应用程序,我需要为它创建一个SQLite DB并用一些值预先填充它 Android文档说明了如何在SQLiteOpenHelper的“onCreate”中执行以下操作: 第一次创建数据库时调用。这是创建表和初始填充表的地方 参考- 我对以下两件事表示怀疑- “首次创建数据库时”是什么意思?这是在第一次启动应用程序时完成的,还是仅在第一次DB请求(读/写等)完成时完成的 如果是后者,我担心可能需要相当长的时间来创建DB,用值预先填充它(我有大约60行要插入到一个表中)

我正在创建一个Android应用程序,我需要为它创建一个SQLite DB并用一些值预先填充它

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

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

参考-

我对以下两件事表示怀疑-

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

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

  • 我一直在异步任务中执行我的所有DB操作。但是我在onCreate中使用“db.execSQL”语句创建表。这很好(在约定/性能方面)还是我也应该在这里执行异步任务

感谢您的帮助。

1)请稍后再联系。它是在第一次读取或写入数据库时完成的

你的担心可能是对的,这就是为什么你可以用已经填充的数据库发布你的应用程序。或者,您可以通过一个简单的
select1 fromtanytable
查询启动一个异步任务。更多关于与DB一起发货的信息。(60行没有什么好担心的,您可以安全地继续使用AsyncTasks)

2) 是的,很好。onCreate逻辑将在您第一次读/写数据库时运行,因此,如果始终使用AsyncTasks,onCreate也将在AsyncTask中运行。

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

  • 一般来说,当您第一次从数据库查询时会发生这种情况。在此之后,当您更改db版本时,也会调用唯一的升级方法
如果是后者,我担心可能需要相当长的时间来创建DB,用值预先填充它(我有大约60行要插入到一个表中),然后读取DB来显示它。这是最好的做法吗

  • 60行插入不是一项大任务。您可以阅读更多关于beginTransaction()、commitTransaction和endTransaction for insertion的信息。这将使您的插入任务快速启动
我一直在异步任务中执行我的所有DB操作。但是我在onCreate中使用“db.execSQL”语句创建表。这很好(在约定/性能方面)还是我也应该在这里执行异步任务

  • 很好,您正在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(使用游标等)相比,这一过程如何