2011-01-28 7 views
9

Uygulamamda SearchManager ile uygulanan iki farklı Arama etkinliğim var. Biri tüm uygulama için varsayılan aranabilir ve diğeri sadece bir etkinlik için kullanılır. Bu iki arama farklı veri aramalarını gerçekleştirir ve arama geçmişini iki farklı aramada paylaşmak mantıklı değildir. İki farklı aranabilirlik, uygulama içinde işlevsel olarak iyi çalışıyor, benim sorunum son arama geçmişleriyle.Birden çok SearchRecentSuggestionsProvider sınıfları Android uygulamasında mümkün mü?

sorun uygulaması içinde tanımlanan iki farklı SearchRecentSuggestionsProvider sınıflar vardır, ama birinde yapılan herhangi bir arama hem aramalar son arama önerileri tarihte görülmesidir. Dev Kılavuz'da SearchManager konusunu okudum, ancak birden çok öneri sağlayıcıları hakkında hiçbir bilgi görmüyorum. İşte

düğümünde, AndroidManifest.xml iki sağlayıcılar şunlardır:

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); 
    } 
    } 

(SearchTwoRecentSuggestionsProvider sınıfı tamamen aynı görünüyor: Burada

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

SearchOneRecentSuggestionsProvider.java tanımlanan sınıf var Bir ile iki değiştirme ve kendi SearchTwoRecentSuggestionsProvider.java dosyasında olduğu dışında.)

İşte nedir (/data/data/com.company/databases/suggestions.db at) arama önerileri veritabanı içinde:

SearchRecentSuggestionsProvider için sütun var
# 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 

, belki iki aramalar için tarih ayırmak için hiçbir yolu yoktur ?

Tüm bunların sonucunda, iki farklı aramadan birinde arama yaptığınızda, hem arama yapabildiğinizi hem de son arama geçmişi önerilerinde arama yaptınız. Mümkünse her birinin kendi tarihine sahip olmasını istiyorum. Umarım sadece aptalca bir şey kaçırmadım! Bunu okumak için zaman ayırdığınız için teşekkürler.

cevap

2

Ben SearchRecentSuggestionsProvider ve SearchRecentSuggestions kaynak kodu baktı ve açıkça bu sınıflar bu kadar işe yaramaz aynı uygulamasında çeşitli SearchRecentSuggestionsProvider kullanarak birden sağlayıcılarını ya da değil (kullanırsanız ilgili değil, tüm uygulamanın arasında ortak bir veritabanını kullanmak için tasarlanmıştır). İki farklı veritabanını kullanmanın bir yolunu bulamıyorum.

Ama bir kandırmayı düşündüm: saveRecentQuery() ile kaydederken her bir sorgunun başlangıcında bir karakter ekleyin (etkinlik1 son aramalar için '1' ve 'son 2 aramalar için' 2 '). Eğer etkinlik1 iseniz, saveRecentQuery ('1' + query, ...) yapacaksınız.

Sonra geçersiz SearchRecentSuggestionsProvider.query(), burada '1', ilk karakterin değerine bağlı olarak göstermek istediğiniz satırları filtreleyebilirsiniz ya da '2' (aynı zamanda tabii ki, dize çıkarmak gerekir). Eğer aktivitedeyseniz, sadece '1' ile başlayan değerleri saklamak istiyorsunuz .... Bu şekilde birden çok öneri listesini yönetebilirsiniz. şu an için mümkün değildir gibi

+0

Cevabınız için teşekkür ederiz, kaynak koduna da baktım ve db isminin kodlanmış olduğunu gördüm. Sadece basit bir şeyi kaçırdığımı umuyordum. Geçici çözüm önerilerinizi meslektaşlarımla tartışacağım ve bunun bizim için işe yarayıp yaramayacağını göreceğim. –

+0

Sabit kodlanmış db adı nedir? –