2011-01-28 41 views
9

Tôi có hai hoạt động Tìm kiếm khác nhau được triển khai với SearchManager trong ứng dụng của mình. Một là mặc định có thể tìm kiếm cho toàn bộ ứng dụng và cái kia được sử dụng chỉ cho một hoạt động. Hai tìm kiếm này thực hiện tra cứu dữ liệu khác nhau và không có ý nghĩa gì khi chia sẻ lịch sử tìm kiếm trên hai tìm kiếm khác nhau. Hai tìm kiếm khác nhau đang hoạt động tốt trong ứng dụng, vấn đề của tôi là với lịch sử tìm kiếm gần đây.Nhiều SearchRecentSuggestionsCác lớp học trong ứng dụng Android có thể?

Vấn đề là có hai lớp khác nhau SearchRecentSuggestionsProvider được xác định trong ứng dụng, nhưng mọi tìm kiếm được thực hiện trong một hiển thị trong cả lịch sử tìm kiếm gần đây của cả hai tìm kiếm. Tôi đã đọc qua chủ đề SearchManager trong Hướng dẫn dành cho nhà phát triển nhưng không thấy bất kỳ thông tin nào về nhiều nhà cung cấp đề xuất.

Dưới đây là hai nhà cung cấp trong AndroidManifest.xml, trong nút:

<provider android:name=".SearchOneRecentSuggestionsProvider" 
android:authorities="com.company.SearchOneRecentSuggestionsProvider"></provider> 
<provider android:name=".SearchTwoRecentSuggestionsProvider" 
    android:authorities="com.company.SearchTwoRecentSuggestionsProvider"></provider> 

Dưới đây là các lớp được định nghĩa trong SearchOneRecentSuggestionsProvider.java:

package com.company; 

import android.content.SearchRecentSuggestionsProvider; 

public class SearchOneRecentSuggestionsProvider extends SearchRecentSuggestionsProvider { 
    public final static String AUTHORITY = "com.company.SearchOneRecentSuggestionsProvider"; 
    public final static int MODE = DATABASE_MODE_QUERIES; 

    public SearchOneRecentSuggestionsProvider() { 
     setupSuggestions(AUTHORITY, MODE); 
    } 
    } 

(Lớp SearchTwoRecentSuggestionsProvider trông giống hệt nhau ngoại trừ việc thay thế One with Two và nằm trong tệp SearchTwoRecentSuggestionsProvider.java riêng của nó.)

Đây là những gì bên trong cơ sở dữ liệu gợi ý tìm kiếm (tại /data/data/com.company/databases/suggestions.db):

# sqlite3 suggestions.db 
SQLite version 3.5.9 
Enter ".help" for instructions 
sqlite> .tables 
android_metadata suggestions 
sqlite> .schema suggestions 
CREATE TABLE suggestions (_id INTEGER PRIMARY KEY,display1 TEXT UNIQUE ON CONFLICT REPLACE,query TEXT,date LONG); 
sqlite> select * from suggestions; 
1|searchone|searchone|1296177852444 
2|searchtwo|searchtwo|1296177878744 

Không có cột cho SearchRecentSuggestionsProvider, vì vậy có lẽ không có cách nào để tách lịch sử cho hai tìm kiếm ?

Kết quả cuối cùng của tất cả điều này là khi bạn thực hiện tìm kiếm trong một trong hai tìm kiếm khác nhau, bạn sẽ thấy cả tìm kiếm và tìm kiếm trong các đề xuất lịch sử tìm kiếm gần đây. Tôi muốn mỗi người có lịch sử riêng nếu có thể. Hy vọng rằng tôi không chỉ bỏ lỡ điều gì ngớ ngẩn! Cảm ơn đã dành thời gian để đọc.

Trả lời

1

Có vẻ như không thể thực hiện tại thời điểm này. Đối với những người bạn đang tìm kiếm SO cho cùng một vấn đề này, hãy xem https://code.google.com/p/android/issues/detail?id=13501 để biết các cập nhật trong tương lai từ Google.

2

Tôi nhìn vào mã SearchRecentSuggestionsProviderSearchRecentSuggestions nguồn, và rõ ràng các lớp này được thiết kế để sử dụng một cơ sở dữ liệu phổ biến trong tất cả các ứng dụng, không liên quan đến nếu bạn sử dụng nhiều nhà cung cấp hay không (nên sử dụng nhiều SearchRecentSuggestionsProvider trong cùng một ứng dụng là vô ích). Tôi không thể tìm cách sử dụng hai cơ sở dữ liệu khác nhau.

Nhưng tôi đã nghĩ về một mẹo: thêm ký tự (như '1' cho hoạt động1 tìm kiếm gần đây và '2' cho hoạt động2 tìm kiếm gần đây) ở đầu mỗi truy vấn khi lưu chúng bằng saveRecentQuery(). Nếu bạn đang ở trong activity1, bạn sẽ làm saveRecentQuery ('1' + query, ...).

Sau đó ghi đè lên SearchRecentSuggestionsProvider.query(), tại đây bạn có thể lọc các hàng bạn muốn hiển thị tùy thuộc vào giá trị của ký tự đầu tiên, '1' hoặc '2' (bạn cũng phải xóa nó khỏi chuỗi)). Nếu bạn đang hoạt động1, bạn chỉ muốn giữ các giá trị bắt đầu bằng '1', .... Bằng cách này, bạn có thể xử lý nhiều danh sách đề xuất.

Tuy nhiên đó là một mẹo và tôi không chắc chắn 100% rằng nó sẽ hoạt động như thế này ...

+0

Cảm ơn câu trả lời của bạn, tôi cũng đã xem xét mã nguồn và thấy rằng tên db đã được mã hóa cứng. Tôi chỉ hy vọng tôi đã thiếu một cái gì đó đơn giản. Tôi sẽ thảo luận về đề nghị giải quyết vấn đề của bạn với các đồng nghiệp của tôi và xem liệu điều đó có thể làm việc cho chúng tôi hay không. –

+0

Tên db được mã hóa là gì? –

0

Tôi đã thực hiện một thay đổi nhỏ đến lớp mà làm cho điều này có thể - xem https://gist.github.com/pokebyte/a08a67282a4f19ebbf52

Cụ thể, sự thay đổi thêm một cột lập chỉ mục mới (authority) mà hạn chế tìm kiếm để một cơ quan cụ thể.

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