2015-06-24 26 views
5

Tôi đang làm việc với khung đề xuất tìm kiếm và đây là trường hợp. Tôi nhận được một số chuỗi truy vấn và thực hiện truy vấn từ trình phân giải nội dung, nhưng vấn đề là tôi không thể giới hạn kết quả. Tìm thấy một số giải pháp nhưng họ không làm việc cho tôi.Android SearchRecentSuggestionsGiới hạn truy vấn giới hạn

cung cấp nội dung của tôi là mở rộng SearchRecentSuggestionsProvider và khai báo trong manifest, đây truy vấn uri Uri URI = Uri.parse("content://" + AUTHORITY + "/search_suggest_query");

sol 1: thêm tham số truy vấn để Uri

SearchSuggestionProvider.URI.buildUpon().appendQueryParameter(SearchManager.SUGGEST_PARAMETER_LIMIT, String.valueOf(5)).build()

sol 2: thêm giới hạn trong tham số truy vấn sortOrder

getContentResolver().query(URI, null, "?", new String[]{searchQuery}, "_id asc limit 5");

Trong cả hai trường hợp truy vấn trả về tất cả các hàng từ đề xuất tìm kiếm. Có ai biết làm thế nào để hạn chế một truy vấn như vậy?

+2

tham số SUGGEST_PARAMETER_LIMIT Query thêm vào truy vấn gợi ý để hạn chế số lượng đề nghị trả lại. ** Giới hạn này chỉ là các nhà cung cấp tư vấn và đề nghị có thể chọn bỏ qua nó **. – pskink

+0

Có một giải pháp tốt hơn, một cách hoàn toàn khác, tôi thêm câu trả lời dưới đây –

Trả lời

4

Dưới đây là phương pháp truy vấn trong SearchRecentSuggestionsProvider lớp cơ sở trong khuôn khổ

/** 
    * This method is provided for use by the ContentResolver. Do not override, or directly 
    * call from your own code. 
    */ 
    // TODO: Confirm no injection attacks here, or rewrite. 
    @Override 
    public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, 
      String sortOrder) { 

Thường thì bạn có thể ghi đè lên nó và thực hiện hạn chế - nhưng khi bạn có thể thấy những nhận xét ở trên nó bang rõ ràng "không ghi đè" . Trong phương pháp hiện tại, không có giới hạn nào được thực thi.

Tuy nhiên tôi thấy trong một số câu trả lời khác về chồng tràn và các trang web khác mà mọi người ghi đè lên.

Ví dụ: Use SearchRecentSuggestionsProvider with some predefined terms?

Dựa trên này, tôi nghĩ bạn có thể thử nó ra - ghi đè lên các phương pháp truy vấn và thêm thực hiện của riêng bạn mà hỗ trợ hạn chế các kết quả. Phân tích cú pháp số SearchManager.SUGGEST_PARAMETER_LIMIT mà bạn đã sử dụng trong phương thức truy vấn và sử dụng nó để giới hạn kết quả được trả lại.

+1

"sử dụng giới hạn này khi thực sự truy vấn cơ sở dữ liệu hoặc bất kỳ nguồn dữ liệu nào của bạn là" Câu hỏi này liên quan đến SearchRecentSuggestionsProvider. Hãy cụ thể hơn về cách ghi đè truy vấn 'cho trường hợp này. – lf215

+1

Xin lỗi tôi đã hiểu sai câu hỏi ban đầu. Thêm chi tiết cụ thể hơn ngay bây giờ. – RocketRandom

+0

Có một giải pháp tốt hơn trên một cách hoàn toàn khác, tôi đã thêm câu trả lời dưới đây –

2

Thực ra, chúng tôi đang tìm kiếm sai địa điểm. Sau tất cả các cuộc điều tra này, cuối cùng tôi đã tìm được thủ thuật.

Trên màn hình kết quả (Trong trường hợp chúng tôi lưu truy vấn đến SearchRecentSuggestions tìm kiếm) mà chúng ta gọi phương pháp này

SearchRecentSuggestions suggestions = new SearchRecentSuggestions(this, 
        SearchSuggestionProvider.AUTHORITY, SearchSuggestionProvider.MODE); 
suggestions.saveRecentQuery(query, null); 

SearchRecentSuggestions là người chịu trách nhiệm để lưu truy vấn này đến nhà cung cấp nội dung.

Lớp này có một phương pháp bảo vệ gọi truncateHistory() với tài liệu này

Giảm chiều dài của bảng lịch sử, để ngăn chặn nó từ phát triển quá lớn.

Vì vậy, giải pháp đơn giản, tạo lớp tùy chỉnh, ghi đè phương pháp này và gọi triển khai siêu với giới hạn được yêu cầu.

Dưới đây là ví dụ

public class SearchRecentSuggestionsLimited extends SearchRecentSuggestions { 

    private int limit; 

    public SearchRecentSuggestionsLimited(Context context, String authority, int mode, int limit) { 
     super(context, authority, mode); 
     this.limit = limit; 
    } 

    @Override 
    protected void truncateHistory(ContentResolver cr, int maxEntries) { 
     super.truncateHistory(cr, limit); 
    } 
} 
+0

nếu tôi hiểu đúng, điều đó sẽ giới hạn toàn bộ kích thước bảng, nhưng những gì tôi đã hỏi là làm thế nào để giới hạn số lượng hàng truy vấn? hoặc giải pháp của bạn sẽ không ảnh hưởng đến kích thước bảng? – greenfrvr

+0

Có, nó ảnh hưởng đến kích thước bảng, nhưng vẫn lưu 5 đầu gần đây. Bằng cách giảm kích thước bảng xuống 5 sẽ ảnh hưởng đến các hàng truy vấn. Nhưng nếu bạn muốn có một tùy chọn như hiển thị truy vấn lịch sử hơn, điều này sẽ không giúp bạn. –

Các vấn đề liên quan