AppSearch, yerel olarak depolanan yapılandırılmış verileri yönetmek için yüksek performanslı bir cihaz üzerinde arama çözümüdür. Verileri dizine eklemek ve tam metin araması kullanarak veri almak için API'ler içerir. Uygulamalar, özel uygulama içi arama özellikleri sunmak için AppSearch'ü kullanabilir. Böylece kullanıcılar, çevrimdışıyken bile içerik arayabilir.
AppSearch aşağıdaki özellikleri sunar:
- Düşük G/Ç kullanımıyla hızlı, mobil öncelikli depolama uygulaması
- Büyük veri kümelerinde son derece verimli dizine ekleme ve sorgulama
- İngilizce ve İspanyolca gibi birden fazla dil desteği
- Alaka düzeyi sıralaması ve kullanım puanlaması
Daha düşük G/Ç kullanımı sayesinde AppSearch, SQLite'a kıyasla büyük veri kümelerinde dizine ekleme ve arama için daha düşük gecikme süresi sunar. AppSearch, tek sorguları destekleyerek türler arası sorguları basitleştirir. SQLite ise birden fazla tablodaki sonuçları birleştirir.
AppSearch'ün özelliklerini göstermek için kullanıcıların favori şarkılarını yöneten ve kullanıcıların bu şarkıları kolayca aramasına olanak tanıyan bir müzik uygulamasını örnek olarak ele alalım. Kullanıcılar, AppSearch'ün dizine ekleme ve sorgulama işlemlerini yerel olarak desteklediği farklı dillerdeki şarkı adlarıyla dünyanın dört bir yanından müzik dinleyebilir. Kullanıcı, şarkı başlığı veya sanatçı adına göre şarkı aradığında uygulama, eşleşen şarkıları hızlı ve verimli bir şekilde almak için isteği AppSearch'e iletir. Uygulama, sonuçları göstererek kullanıcıların en sevdikleri şarkıları hızlıca çalmaya başlamasını sağlar.
Kurulum
Uygulamanızda AppSearch'ü kullanmak için aşağıdaki bağımlılıkları uygulamanızın build.gradle dosyasına ekleyin:
Eski
dependencies { def appsearch_version = "1.2.0-alpha02" implementation "androidx.appsearch:appsearch:$appsearch_version" // Use kapt instead of annotationProcessor if writing Kotlin classes annotationProcessor "androidx.appsearch:appsearch-compiler:$appsearch_version" implementation "androidx.appsearch:appsearch-local-storage:$appsearch_version" // PlatformStorage is compatible with Android 12+ devices and supports sharing data // with other apps. Feature support varies by device. Before calling an API that // requires a feature, check Features.isFeatureSupported(). implementation "androidx.appsearch:appsearch-platform-storage:$appsearch_version" // PlayServicesStorage is compatible with all devices that support Google Play Services on // all API levels. It offers similar capabilities to PlatformStorage and is the // recommended solution for lower API levels on which PlatformStorage is not supported. implementation "androidx.appsearch:appsearch-play-services-storage:$appsearch_version" }
Kotlin
dependencies { val appsearch_version = "1.2.0-alpha02" implementation("androidx.appsearch:appsearch:$appsearch_version") // Use annotationProcessor instead of kapt if writing Java classes kapt("androidx.appsearch:appsearch-compiler:$appsearch_version") implementation("androidx.appsearch:appsearch-local-storage:$appsearch_version") // PlatformStorage is compatible with Android 12+ devices and supports sharing data // with other apps. Feature support varies by device. Before calling an API that // requires a feature, check Features.isFeatureSupported(). implementation("androidx.appsearch:appsearch-platform-storage:$appsearch_version") // PlayServicesStorage is compatible with all devices that support Google Play Services on // all API levels. It offers similar capabilities to PlatformStorage and is the // recommended solution for lower API levels on which PlatformStorage is not supported. implementation("androidx.appsearch:appsearch-play-services-storage:$appsearch_version") }
AppSearch kavramları
Aşağıdaki şemada AppSearch kavramları ve bunların etkileşimleri gösterilmektedir.
Şekil 1. AppSearch kavramlarının diyagramı: AppSearch veritabanı, şema, şema türleri, dokümanlar, oturum ve arama.
Veritabanı ve oturum
AppSearch veritabanı, veritabanı şemasına uygun bir doküman koleksiyonudur. İstemci uygulamalar, uygulama bağlamlarını ve veritabanı adını sağlayarak veritabanı oluşturur. Veritabanları yalnızca kendilerini oluşturan uygulama tarafından açılabilir. Bir veritabanı açıldığında, veritabanıyla etkileşim kurmak için bir oturum döndürülür. Oturum, AppSearch API'lerini çağırmak için giriş noktasıdır ve istemci uygulama tarafından kapatılana kadar açık kalır.
Şema ve şema türleri
Şema, AppSearch veritabanındaki verilerin kurumsal yapısını temsil eder.
Şema, benzersiz veri türlerini temsil eden şema türlerinden oluşur. Şema türleri; ad, veri türü ve kardinalite içeren özelliklerden oluşur. Veritabanı şemasına bir şema türü eklendikten sonra bu şema türündeki dokümanlar oluşturulabilir ve veritabanına eklenebilir.
Dokümanlar
AppSearch'te bir veri birimi, doküman olarak temsil edilir. AppSearch veritabanındaki her doküman, ad alanı ve kimliğiyle benzersiz şekilde tanımlanır. Ad alanları, yalnızca bir kaynağın (ör. kullanıcı hesapları) sorgulanması gerektiğinde farklı kaynaklardan gelen verileri ayırmak için kullanılır.
Dokümanlarda oluşturma zaman damgası, geçerlilik süresi (TTL) ve alma sırasında sıralama için kullanılabilecek bir puan bulunur. Belgeye, sahip olması gereken ek veri özelliklerini açıklayan bir şema türü de atanır.
Belge sınıfı, bir belgenin soyutlamasıdır. Bir dokümanın içeriğini temsil eden açıklamalı alanlar içerir. Varsayılan olarak, doküman sınıfının adı şema türünün adını belirler.
Arama
Dokümanlar dizine eklenir ve sorgu girilerek aranabilir. Sorgudaki terimleri içeren veya başka bir arama spesifikasyonuyla eşleşen dokümanlar eşleştirilir ve arama sonuçlarına dahil edilir. Sonuçlar, puanlarına ve sıralama stratejilerine göre sıralanır. Arama sonuçları, sırayla alabileceğiniz sayfalarla temsil edilir.
AppSearch, arama için filtreler, sayfa boyutu yapılandırması ve snippet oluşturma gibi özelleştirmeler sunar.
Platform Depolama Alanı, Yerel Depolama Alanı veya Play Hizmetleri Depolama Alanı
AppSearch üç depolama çözümü sunar: LocalStorage, PlatformStorage ve PlayServicesStorage. LocalStorage ile uygulamanız, uygulama verileri dizininizde bulunan uygulamaya özel bir dizini yönetir. Hem PlatformStorage hem de PlayServicesStorage ile uygulamanız, sistem genelindeki merkezi bir dizine katkıda bulunur. PlatformStorage dizini sistem sunucusunda, PlayServicesStorage dizini ise Google Play Hizmetleri'nin depolama alanında barındırılır. Bu merkezi dizinlerdeki veri erişimi, uygulamanızın katkıda bulunduğu veriler ve başka bir uygulama tarafından sizinle açıkça paylaşılan verilerle sınırlıdır. Tüm bu depolama alanı seçenekleri aynı API'yi paylaşır ve cihazın sürümüne göre birbirinin yerine kullanılabilir.
Özellik desteğinin depolama alanı seçeneğine ve cihaza göre değiştiğini unutmayın. Daha fazla bilgi için Özellik kullanılabilirliğini kontrol etme başlıklı makaleyi inceleyin.
Aşağıdaki kod, Android 12 (API düzeyi 31) ve sonraki sürümlerde bir PlatformStorage oturumu, önceki sürümlerde ise bir PlayServicesStorage veya LocalStorage oturumu oluşturur:
Kotlin
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { appSearchSessionFuture.setFuture( PlatformStorage.createSearchSession( PlatformStorage.SearchContext.Builder(mContext, DATABASE_NAME) .build() ) ) } else { if (usePlayServicesStorageBelowS) { appSearchSessionFuture.setFuture( PlayServicesStorage.createSearchSession( PlayServicesStorage.SearchContext.Builder(mContext, DATABASE_NAME) .build() ) ) } else { appSearchSessionFuture.setFuture( LocalStorage.createSearchSession( LocalStorage.SearchContext.Builder(mContext, DATABASE_NAME) .build() ) ) } }
Java
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { mAppSearchSessionFuture.setFuture(PlatformStorage.createSearchSession( new PlatformStorage.SearchContext.Builder(mContext, DATABASE_NAME) .build())); } else { if (usePlayServicesStorageBelowS) { mAppSearchSessionFuture.setFuture(PlayServicesStorage.createSearchSession( new PlayServicesStorage.SearchContext.Builder(mContext, DATABASE_NAME) .build())); } else { mAppSearchSessionFuture.setFuture(LocalStorage.createSearchSession( new LocalStorage.SearchContext.Builder(mContext, DATABASE_NAME) .build())); } }
PlatformStorage ve PlayServicesStorage kullanarak uygulamanız, diğer uygulamaların da uygulamanızın verilerinde arama yapmasına izin vermek için verileri diğer uygulamalarla güvenli bir şekilde paylaşabilir. Salt okunur uygulama verisi paylaşımı, diğer uygulamanın verileri okuma izni olduğundan emin olmak için sertifika el sıkışması kullanılarak verilir. Bu API hakkında daha fazla bilgiyi setSchemaTypeVisibilityForPackage() belgelerinde bulabilirsiniz.
Ayrıca PlatformStorage ile dizine eklenen veriler, sistem kullanıcı arayüzü yüzeylerinde gösterilebilir. Uygulamalar, verilerinin bir kısmının veya tamamının Sistem kullanıcı arayüzü yüzeylerinde gösterilmesini devre dışı bırakabilir. Bu API hakkında daha fazla bilgiyi setSchemaTypeDisplayedBySystem() belgelerinde bulabilirsiniz.
| Özellikler | LocalStorage (Android 5.0 ve sonraki sürümlerle uyumlu) |
PlatformStorage (Android 12 ve sonraki sürümlerle uyumlu) |
PlayServicesStorage (Android 5.0 ve sonraki sürümlerle uyumlu) |
|---|---|---|---|
| Etkili tam metin araması | |||
| Birden fazla dil desteği | |||
| İkili program boyutu küçültüldü | |||
| Uygulamalar arası veri paylaşımı | |||
| Sistem kullanıcı arayüzü yüzeylerinde veri görüntüleme özelliği | |||
| Sınırsız doküman boyutu ve sayısı dizine eklenebilir. | |||
| Ek bağlayıcı gecikmesi olmadan daha hızlı işlemler |
LocalStorage ve PlatformStorage arasında seçim yaparken göz önünde bulundurulması gereken başka avantaj ve dezavantajlar da vardır. PlatformStorage, AppSearch sistem hizmeti üzerinden Jetpack API'lerini sarmaladığı için APK boyutu üzerindeki etkisi, LocalStorage kullanımına kıyasla minimum düzeydedir. Ancak bu durum, AppSearch işlemlerinin AppSearch sistem hizmetini çağırırken ek bağlayıcı gecikmesine neden olduğu anlamına da gelir. PlatformStorage ile AppSearch, verimli bir merkezi dizin oluşturmak için bir uygulamanın dizine ekleyebileceği doküman sayısını ve boyutunu sınırlandırır. PlayServicesStorage, PlatformStorage ile aynı sınırlamalara sahiptir ve yalnızca Google Play Hizmetleri'nin yüklü olduğu cihazlarda desteklenir.
Özelliklerin kullanıma sunulma durumunu kontrol etme
Tüm depolama seçenekleri aynı API'yi paylaşsa da bazı özellikler her depolama seçeneğinde veya her cihazda kullanılamaz. API referansında, @RequiresFeature ek açıklaması bu özelliklerden birini gerektiren API'leri tanımlar ve Features sınıfı her özellik için bir sabit tanımlar. Örneğin,
INDEXING_TYPE_RANGE
Features.NUMERIC_SEARCH gerektirir.
PlatformStorage için özellik desteği, cihazın Android sürümüne bağlıdır.
Android 13'ten (API düzeyi 33) itibaren özellik desteği, cihazın aldığı Google Play sistem güncellemelerine de bağlıdır. Örneğin, PlatformStorage; sayısal arama (Features.NUMERIC_SEARCH), harfi harfine arama (Features.VERBATIM_SEARCH) ve birleştirmeleri (Features.JOIN_SPEC_AND_QUALIFIED_ID) yalnızca aşağıdaki cihazlarda destekler:
- Android 14 (API düzeyi 34) veya sonraki sürümlerin yüklü olduğu cihazlar
- Android 13 (API düzeyi 33) çalıştıran ve gerekli Google Play sistem güncellemesini almış cihazlar.
Bu özellikler, Android 12 veya Android 12L (API düzeyi 31 ve 32) çalıştıran cihazlarda desteklenmez.
Bir dokümandaki dizine eklenen özelliklerin maksimum sayısı da cihaza ve depolama seçeneğine göre değişir. Çalışma zamanında sınırı öğrenmek için getMaxIndexedProperties() işlevini çağırın.
Özellik desteğini belirlemek için yalnızca Android sürümüne güvenmeyin. Özellik gerektiren bir API'yi çağırmadan önce, AppSearchSession.getFeatures() tarafından döndürülen Features nesnesinde isFeatureSupported() yöntemini çağırarak özelliğin desteklendiğini doğrulayın. Gerekli bir özellik desteklenmiyorsa işlem başarısız olur ve bir istisna döndürülür. Örneğin, INDEXING_TYPE_RANGE özelliğini içeren bir şema ayarlanırken Features.NUMERIC_SEARCH özelliğini desteklemeyen cihazlarda hata oluşur.
Aşağıdaki kod, açık bir AppSearchSession nesnesinin sayısal aramayı destekleyip desteklemediğini kontrol eder:
Kotlin
val features = session.features if (features.isFeatureSupported(Features.NUMERIC_SEARCH)) { // Numeric search is supported. You can index properties with // LongPropertyConfig.INDEXING_TYPE_RANGE and enable numeric search with // SearchSpec.Builder.setNumericSearchEnabled(true). } else { // Numeric search isn't supported. Set a schema without range-indexed // properties, or switch to a different storage option. }
Java
Features features = session.getFeatures(); if (features.isFeatureSupported(Features.NUMERIC_SEARCH)) { // Numeric search is supported. You can index properties with // LongPropertyConfig.INDEXING_TYPE_RANGE and enable numeric search with // SearchSpec.Builder.setNumericSearchEnabled(true). } else { // Numeric search isn't supported. Set a schema without range-indexed // properties, or switch to a different storage option. }
AppSearch'ü kullanmaya başlama
Bu bölümdeki örnekte, varsayımsal bir not alma uygulamasıyla entegrasyon için AppSearch API'lerinin nasıl kullanılacağı gösterilmektedir.
Doküman sınıfı yazma
AppSearch ile entegrasyonun ilk adımı, veritabanına eklenecek verileri açıklayan bir belge sınıfı yazmaktır. @Document ek açıklamasını kullanarak bir sınıfı doküman sınıfı olarak işaretleyin.Dokümanları veritabanına yerleştirmek ve veritabanından almak için doküman sınıfının örneklerini kullanabilirsiniz.
Aşağıdaki kod, bir Note nesnesinin metnini dizine eklemek için @Document.StringProperty ek açıklamalı bir alan içeren Note doküman sınıfını tanımlar.
Kotlin
@Document public data class Note( // Required field for a document class. All documents MUST have a namespace. @Document.Namespace val namespace: String, // Required field for a document class. All documents MUST have an Id. @Document.Id val id: String, // Optional field for a document class, used to set the score of the // document. If this is not included in a document class, the score is set // to a default of 0. @Document.Score val score: Int, // Optional field for a document class, used to index a note's text for this // document class. @Document.StringProperty(indexingType = AppSearchSchema.StringPropertyConfig.INDEXING_TYPE_PREFIXES) val text: String )
Java
@Document public class Note { // Required field for a document class. All documents MUST have a namespace. @Document.Namespace private final String namespace; // Required field for a document class. All documents MUST have an Id. @Document.Id private final String id; // Optional field for a document class, used to set the score of the // document. If this is not included in a document class, the score is set // to a default of 0. @Document.Score private final int score; // Optional field for a document class, used to index a note's text for this // document class. @Document.StringProperty(indexingType = StringPropertyConfig.INDEXING_TYPE_PREFIXES) private final String text; Note(@NonNull String id, @NonNull String namespace, int score, @NonNull String text) { this.id = Objects.requireNonNull(id); this.namespace = Objects.requireNonNull(namespace); this.score = score; this.text = Objects.requireNonNull(text); } @NonNull public String getNamespace() { return namespace; } @NonNull public String getId() { return id; } public int getScore() { return score; } @NonNull public String getText() { return text; } }
Veritabanı açma
Belgelerle çalışmadan önce bir veritabanı oluşturmanız gerekir. Aşağıdaki kod, notes_app adında yeni bir veritabanı oluşturur ve veritabanı bağlantısını temsil eden ve veritabanı işlemleri için API'leri sağlayan bir AppSearchSession için ListenableFuture alır.
Kotlin
val context: Context = getApplicationContext() val sessionFuture = LocalStorage.createSearchSession( LocalStorage.SearchContext.Builder(context, /*databaseName=*/"notes_app") .build() )
Java
Context context = getApplicationContext(); ListenableFuture<AppSearchSession> sessionFuture = LocalStorage.createSearchSession( new LocalStorage.SearchContext.Builder(context, /*databaseName=*/ "notes_app") .build() );
Şema ayarlama
Veritabanına belge ekleyip veritabanından belge alabilmek için önce bir şema ayarlamanız gerekir. Veritabanı şeması, "şema türleri" olarak adlandırılan farklı yapılandırılmış veri türlerinden oluşur. Aşağıdaki kod, doküman sınıfını şema türü olarak sağlayarak şemayı ayarlar.
Kotlin
val setSchemaRequest = SetSchemaRequest.Builder().addDocumentClasses(Note::class.java) .build() val setSchemaFuture = Futures.transformAsync( sessionFuture, { session -> session?.setSchema(setSchemaRequest) }, mExecutor )
Java
SetSchemaRequest setSchemaRequest = new SetSchemaRequest.Builder().addDocumentClasses(Note.class) .build(); ListenableFuture<SetSchemaResponse> setSchemaFuture = Futures.transformAsync(sessionFuture, session -> session.setSchema(setSchemaRequest), mExecutor);
Veritabanına doküman ekleme
Bir şema türü eklendikten sonra bu türdeki dokümanları veritabanına ekleyebilirsiniz.
Aşağıdaki kod, Note doküman sınıfı derleyicisini kullanarak Note şema türünde bir doküman oluşturur. Bu örnekteki rastgele bir kullanıcıyı temsil etmek için doküman ad alanını user1 olarak ayarlar. Ardından doküman veritabanına eklenir ve yerleştirme işleminin sonucunu işlemek için bir dinleyici eklenir.
Kotlin
val note = Note( namespace="user1", id="noteId", score=10, text="Buy fresh fruit" ) val putRequest = PutDocumentsRequest.Builder().addDocuments(note).build() val putFuture = Futures.transformAsync( sessionFuture, { session -> session?.put(putRequest) }, mExecutor ) Futures.addCallback( putFuture, object : FutureCallback<AppSearchBatchResult<String, Void>?> { override fun onSuccess(result: AppSearchBatchResult<String, Void>?) { // Gets map of successful results from Id to Void val successfulResults = result?.successes // Gets map of failed results from Id to AppSearchResult val failedResults = result?.failures } override fun onFailure(t: Throwable) { Log.e(TAG, "Failed to put documents.", t) } }, mExecutor )
Java
Note note = new Note(/*namespace=*/"user1", /*id=*/ "noteId", /*score=*/ 10, /*text=*/ "Buy fresh fruit!"); PutDocumentsRequest putRequest = new PutDocumentsRequest.Builder().addDocuments(note) .build(); ListenableFuture<AppSearchBatchResult<String, Void>> putFuture = Futures.transformAsync(sessionFuture, session -> session.put(putRequest), mExecutor); Futures.addCallback(putFuture, new FutureCallback<AppSearchBatchResult<String, Void>>() { @Override public void onSuccess(@Nullable AppSearchBatchResult<String, Void> result) { // Gets map of successful results from Id to Void Map<String, Void> successfulResults = result.getSuccesses(); // Gets map of failed results from Id to AppSearchResult Map<String, AppSearchResult<Void>> failedResults = result.getFailures(); } @Override public void onFailure(@NonNull Throwable t) { Log.e(TAG, "Failed to put documents.", t); } }, mExecutor);
Arama
Bu bölümde ele alınan arama operatörlerini kullanarak dizine eklenen dokümanlarda arama yapabilirsiniz. Aşağıdaki kod, user1 ad alanına ait dokümanlar için veritabanında "meyve" terimini sorgular.
Kotlin
val searchSpec = SearchSpec.Builder() .addFilterNamespaces("user1") .build(); val searchFuture = Futures.transform( sessionFuture, { session -> session?.search("fruit", searchSpec) }, mExecutor ) Futures.addCallback( searchFuture, object : FutureCallback<SearchResults> { override fun onSuccess(searchResults: SearchResults?) { iterateSearchResults(searchResults) } override fun onFailure(t: Throwable?) { Log.e("TAG", "Failed to search notes in AppSearch.", t) } }, mExecutor )
Java
SearchSpec searchSpec = new SearchSpec.Builder() .addFilterNamespaces("user1") .build(); ListenableFuture<SearchResults> searchFuture = Futures.transform(sessionFuture, session -> session.search("fruit", searchSpec), mExecutor); Futures.addCallback(searchFuture, new FutureCallback<SearchResults>() { @Override public void onSuccess(@Nullable SearchResults searchResults) { iterateSearchResults(searchResults); } @Override public void onFailure(@NonNull Throwable t) { Log.e(TAG, "Failed to search notes in AppSearch.", t); } }, mExecutor);
SearchResults'da yineleme yapma
Aramalar, SearchResult nesnelerinin sayfalarına erişim sağlayan bir SearchResults örneği döndürür. Her SearchResult, eşleşen GenericDocument'sini (tüm dokümanların dönüştürüldüğü genel doküman biçimi) barındırır. Aşağıdaki kod, arama sonuçlarının ilk sayfasını alır ve sonucu tekrar bir Note belgesine dönüştürür.
Kotlin
Futures.transform( searchResults?.nextPage, { page: List<SearchResult>? -> // Gets GenericDocument from SearchResult. val genericDocument: GenericDocument = page!![0].genericDocument val schemaType = genericDocument.schemaType val note: Note? = try { if (schemaType == "Note") { // Converts GenericDocument object to Note object. genericDocument.toDocumentClass(Note::class.java) } else null } catch (e: AppSearchException) { Log.e( TAG, "Failed to convert GenericDocument to Note", e ) null } note }, mExecutor )
Java
Futures.transform(searchResults.getNextPage(), page -> { // Gets GenericDocument from SearchResult. GenericDocument genericDocument = page.get(0).getGenericDocument(); String schemaType = genericDocument.getSchemaType(); Note note = null; if (schemaType.equals("Note")) { try { // Converts GenericDocument object to Note object. note = genericDocument.toDocumentClass(Note.class); } catch (AppSearchException e) { Log.e(TAG, "Failed to convert GenericDocument to Note", e); } } return note; }, mExecutor);
Belge kaldırma
Kullanıcı bir notu sildiğinde uygulama, veritabanından ilgili Note dokümanını siler. Böylece not, sorgularda artık gösterilmez. Aşağıdaki kod, kimliğe göre veritabanından Note belgesini kaldırmak için açık bir istekte bulunur.
Kotlin
val removeRequest = RemoveByDocumentIdRequest.Builder("user1") .addIds("noteId") .build() val removeFuture = Futures.transformAsync( sessionFuture, { session -> session?.remove(removeRequest) }, mExecutor )
Java
RemoveByDocumentIdRequest removeRequest = new RemoveByDocumentIdRequest.Builder("user1") .addIds("noteId") .build(); ListenableFuture<AppSearchBatchResult<String, Void>> removeFuture = Futures.transformAsync(sessionFuture, session -> session.remove(removeRequest), mExecutor);
Diske kaydetme
Veritabanında yapılan güncellemeler, requestFlush() çağrılarak düzenli olarak diske kaydedilmelidir. Aşağıdaki kod, çağrının başarılı olup olmadığını belirlemek için bir dinleyiciyle requestFlush() yöntemini çağırır.
Kotlin
val requestFlushFuture = Futures.transformAsync( sessionFuture, { session -> session?.requestFlush() }, mExecutor ) Futures.addCallback(requestFlushFuture, object : FutureCallback<Void?> { override fun onSuccess(result: Void?) { // Success! Database updates have been persisted to disk. } override fun onFailure(t: Throwable) { Log.e(TAG, "Failed to flush database updates.", t) } }, mExecutor)
Java
ListenableFuture<Void> requestFlushFuture = Futures.transformAsync(sessionFuture, session -> session.requestFlush(), mExecutor); Futures.addCallback(requestFlushFuture, new FutureCallback<Void>() { @Override public void onSuccess(@Nullable Void result) { // Success! Database updates have been persisted to disk. } @Override public void onFailure(@NonNull Throwable t) { Log.e(TAG, "Failed to flush database updates.", t); } }, mExecutor);
Oturumu kapatma
Bir uygulama artık herhangi bir veritabanı işlemi çağırmayacaksa AppSearchSession kapatılmalıdır. Aşağıdaki kod, daha önce açılan AppSearch oturumunu kapatır ve tüm güncellemeleri diske kaydeder.
Kotlin
val closeFuture = Futures.transform<AppSearchSession, Unit>(sessionFuture, { session -> session?.close() Unit }, mExecutor )
Java
ListenableFuture<Void> closeFuture = Futures.transform(sessionFuture, session -> { session.close(); return null; }, mExecutor);
Ek kaynaklar
AppSearch hakkında daha fazla bilgi edinmek için aşağıdaki ek kaynaklara göz atın:
Örnekler
- Android AppSearch Örneği (Kotlin), kullanıcının notlarını dizine eklemek için AppSearch'ü kullanan ve kullanıcıların notlarında arama yapmasına olanak tanıyan bir not alma uygulamasıdır.
Geri bildirim gönderme
Geri bildirimlerinizi ve fikirlerinizi aşağıdaki kaynaklar aracılığıyla bizimle paylaşabilirsiniz:
Hataları düzeltebilmemiz için bize bildirin.