我在Android應用程序上使用SQLite
數據庫,我寫的getAll
方法在我看來花費了太多時間。通過SQLite光標循環需要的時間太長
這是我講的代碼:
public static List<Feed> getAll(Context context) {
List<Feed> feeds = new ArrayList<Feed>();
Uri allFeeds = Uri.parse(ContentProvidersUris.URL_CONTENT_PROVIDER_FEED);
long startQuery = BenchmarkUtils.start();
Cursor c = context.getContentResolver().query(allFeeds, null, null, null, "title desc");
long startCursor = BenchmarkUtils.start();
for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
long startInsideCursor = BenchmarkUtils.start();
Feed feed = new Feed();
feed.setContent(c.getString(c.getColumnIndex(FeedsProvider.COL_WEBVIEW_CONTENT)));
feed.setDate(c.getString(c.getColumnIndex(FeedsProvider.COL_PUB_DATE)));
feed.setDescription(c.getString(c.getColumnIndex(FeedsProvider.COL_DESCRIPTION)));
feed.setName(c.getString(c.getColumnIndex(FeedsProvider.COL_FEED_NAME)));
Log.d(TAG, "This loop cursor iteration took : " + BenchmarkUtils.stop(startInsideCursor) + " ms.");
}
Log.d(TAG, "Looping through the ENTIRE Cursor took: " + BenchmarkUtils.stop(startCursor) + " ms.");
return feeds;
}
正如你看到的,我也通過測量這個循環在每次迭代所花費的時間和事實證明,它需要的的平均時間1800 ms(在Nexus S
上)。我發現這是很多時間。而我不明白的是,大部分時間爲如下的日誌上的第一次迭代花:
d/FeedsProviderHelper(5800):這個循環迭代光標了:1726毫秒。
D/FeedsProviderHelper(5800):此循環遊標迭代花費:3毫秒。
D/FeedsProviderHelper(5800):此循環遊標迭代花費:2 ms。
D/FeedsProviderHelper(5800):此循環遊標迭代花費:3毫秒。
D/FeedsProviderHelper(5800):此循環遊標迭代花費:2 ms。
D/FeedsProviderHelper(5800):此循環遊標迭代花費:3毫秒。
D/FeedsProviderHelper(5800):此循環遊標迭代花費:3毫秒。
D/FeedsProviderHelper(5800):此循環遊標迭代花費:2 ms。
D/FeedsProviderHelper(5800):此循環遊標迭代花費:0毫秒。
D/FeedsProviderHelper(5800):此循環遊標迭代花費:5毫秒。
D/FeedsProviderHelper(5800):此循環遊標迭代花費:1 ms。
D/FeedsProviderHelper(5800):此循環遊標迭代花費:1 ms。
D/FeedsProviderHelper(5800):此循環遊標迭代花費:5毫秒。
D/FeedsProviderHelper(5800):此循環遊標迭代花費:1 ms。
D/FeedsProviderHelper(5800):此循環遊標迭代花費:1 ms。
D/FeedsProviderHelper(5800):此循環遊標迭代花費:1 ms。
D/FeedsProviderHelper(5800):循環遍歷整個光標需要: 1770毫秒。
所以我的問題是:
它是正常的嗎?如果是,爲什麼?如果不是,我做錯了什麼?針對SQLite數據庫執行selectAll
的更快方法?
謝謝!
編輯
我把getColumnIndex
通話圈外作爲@superfell建議,現在我在平均1500毫秒運行getAll
方法。這是更快但速度不夠快,在我看來(再次)!
如果內容提供者處於相同的過程中,還是跨越過程,那麼第一行的時序看起來很奇怪。 – superfell
@superfell同樣的過程。 –