Tôi đang sử dụng cơ sở dữ liệu SQLite
trên một ứng dụng Android và phương pháp getAll
mà tôi đã viết mất quá nhiều thời gian theo ý kiến của tôi.Lặp qua một Con trỏ SQLite mất quá nhiều thời gian
Đây là mã tôi đang nói về:
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;
}
Như bạn có thể thấy tôi cũng đang đo thời gian thực hiện bằng vòng lặp này tại mỗi lần lặp và nó chỉ ra rằng phải mất một thời gian trung bình của 1800 ms (trên Nexus S
). Tôi thấy rằng đây là rất nhiều thời gian. Và những gì tôi không hiểu là hầu hết thời gian này là dành vào ngày đầu tiên lặp như thể hiện trong các bản ghi:
D/FeedsProviderHelper (5800): con trỏ lặp Vòng lặp này mất: 1726 ms.
D/FeedsProviderHelper (5800): Vòng lặp con trỏ vòng lặp này mất: 3 ms.
D/FeedsProviderHelper (5800): Vòng lặp con trỏ vòng lặp này mất: 2 ms.
D/FeedsProviderHelper (5800): Vòng lặp con trỏ vòng lặp này mất: 3 ms.
D/FeedsProviderHelper (5800): Vòng lặp con trỏ vòng lặp này mất: 2 ms.
D/FeedsProviderHelper (5800): Vòng lặp con trỏ vòng lặp này mất: 3 ms.
D/FeedsProviderHelper (5800): Vòng lặp con trỏ vòng lặp này mất: 3 ms.
D/FeedsProviderHelper (5800): Vòng lặp con trỏ vòng lặp này mất: 2 ms.
D/FeedsProviderHelper (5800): Vòng lặp con trỏ vòng lặp này mất: 0 ms.
D/FeedsProviderHelper (5800): Vòng lặp con trỏ vòng lặp này mất: 5 ms.
D/FeedsProviderHelper (5800): Vòng lặp con trỏ vòng lặp này mất: 1 ms.
D/FeedsProviderHelper (5800): Vòng lặp con trỏ vòng lặp này mất: 1 ms.
D/FeedsProviderHelper (5800): Vòng lặp con trỏ vòng lặp này mất: 5 ms.
D/FeedsProviderHelper (5800): Vòng lặp con trỏ vòng lặp này mất: 1 ms.
D/FeedsProviderHelper (5800): Vòng lặp con trỏ vòng lặp này mất: 1 ms.
D/FeedsProviderHelper (5800): Vòng lặp con trỏ vòng lặp này mất: 1 ms.
D/FeedsProviderHelper (5800): Lặp qua con trỏ ENTIRE mất: 1770 ms.
Vì vậy, câu hỏi của tôi là:
Có bình thường không? Nếu đúng thì tại sao? Nếu không, tôi đang làm gì sai? Bất kỳ cách nào nhanh hơn để thực hiện một selectAll
đối với cơ sở dữ liệu SQLite?
Cảm ơn!
EDIT
Tôi đã getColumnIndex
cuộc gọi ra khỏi vòng lặp như @superfell đề nghị, và bây giờ tôi đang chạy phương pháp getAll
ở mức trung bình 1500ms. Nó nhanh hơn nhưng không đủ nhanh theo ý kiến của tôi (một lần nữa)!
Là nhà cung cấp nội dung trong cùng một quy trình, hoặc là nó sẽ vượt qua quá trình, thời gian trên hàng đầu tiên trông rất kỳ quặc. – superfell
@superfell Cùng một quy trình. –