AppSearch

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'te dizine ekleme ve arama yapmayı gösteren diyagram

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.

İstemci uygulamasının ve şu AppSearch kavramlarıyla etkileşimlerinin ana hatlarını gösteren diyagram: AppSearch veritabanı, şema, şema türleri, dokümanlar, oturum ve arama. Ş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.

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

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:

Issue Tracker

Hataları düzeltebilmemiz için bize bildirin.