我想知道是否有人对通过ContentResolver
查询ContentProvider
和在同一进程中查询SQLiteDatabase
对象进行了性能测试。 我猜测通过ContentResolver
查询会返回一个与数据库通过Binder(Android IPC)通信的Cursor。这意味着,如果我通过Cursor
读取100条记录的内容,那么将会有100次Binder方法调用。我的猜测正确吗? 如果是,那么相比于在同一进程中访问数据库,这样做会慢得多吗?
我想知道是否有人对通过ContentResolver
查询ContentProvider
和在同一进程中查询SQLiteDatabase
对象进行了性能测试。 我猜测通过ContentResolver
查询会返回一个与数据库通过Binder(Android IPC)通信的Cursor。这意味着,如果我通过Cursor
读取100条记录的内容,那么将会有100次Binder方法调用。我的猜测正确吗? 如果是,那么相比于在同一进程中访问数据库,这样做会慢得多吗?
我没有做过完全相同的测试。我的测试是通过ContentProvider或直接通过SQLite数据库插入多个数据来测试性能。
我逐个插入了大约1000个数据项。通过ContentProvider插入的速度要慢得多。在我的测试中,几乎慢了10%。
没有确定的答案,结果取决于您做什么以及如何做。
例如,我想在应用程序之间共享首选项,因此ContentProvider似乎是完美的答案。是的,如果我不介意第一次读取时需要更长的延迟,因为连接到ContentProvider这个过程在S10+上需要120ms!
因此,如果您的UI依赖于这些设置,则最好在应用程序之间复制首选项文件(使用ContentProvider),然后直接从文件中读取,否则在显示适当的主题之前,UI将被延迟。事实上,onStart()方法已经被调用了。
相反,进行DB操作(如果正确执行)不会改变结果太多,除非您需要频繁重新连接,这会增加显著的开销。