Google is committed to advancing racial equity for Black communities. See how.
این صفحه به‌وسیله ‏Cloud Translation API‏ ترجمه شده است.
Switch to English

دسترسی آفلاین به داده ها

Cloud Firestore از ماندگاری داده های آفلاین پشتیبانی می کند. این ویژگی یک کپی از داده های Cloud Firestore را که برنامه شما به طور فعال از آن استفاده می کند ، ذخیره می کند ، بنابراین وقتی دستگاه آفلاین است ، برنامه شما می تواند به داده ها دسترسی پیدا کند. می توانید داده های ذخیره شده را بنویسید ، بخوانید ، گوش دهید و از آنها پرس و جو کنید. هنگامی که دستگاه دوباره آنلاین شد ، Cloud Firestore هرگونه تغییر محلی ایجاد شده توسط برنامه شما را در بخش Back-Up Cloud Firestore هماهنگ می کند.

برای استفاده از ماندگاری آفلاین ، نیازی به تغییر در کدی نیستید که برای دسترسی به داده های Cloud Firestore استفاده می کنید. با فعال بودن ماندگاری آفلاین ، کتابخانه سرویس Cloud Firestore به طور خودکار دسترسی آنلاین و آفلاین داده را مدیریت کرده و داده های محلی را هنگامی که دستگاه دوباره آنلاین است همگام سازی می کند.

پیکربندی آفلاین را انجام دهید

وقتی Cloud Firestore را مقداردهی اولیه می کنید ، می توانید پایداری آفلاین را فعال یا غیرفعال کنید:

  • برای Android و iOS ، ماندگاری آفلاین به طور پیش فرض فعال است. برای غیرفعال کردن ماندگاری ، گزینه PersistenceEnabled را روی false .
  • برای وب ، ماندگاری آفلاین به طور پیش فرض غیرفعال است. برای فعال کردن ماندگاری ، با روش enablePersistence تماس enablePersistence . حافظه پنهان Cloud Firestore بین جلسات به طور خودکار پاک نمی شود. در نتیجه ، اگر برنامه وب شما از اطلاعات حساس استفاده می کند ، قبل از فعال کردن پایداری ، از کاربر س ifال کنید که آیا او روی دستگاه معتبری است یا خیر.
وب
firebase.firestore().enablePersistence()
  .catch(function(err) {
      if (err.code == 'failed-precondition') {
          // Multiple tabs open, persistence can only be enabled
          // in one tab at a a time.
          // ...
      } else if (err.code == 'unimplemented') {
          // The current browser does not support all of the
          // features required to enable persistence
          // ...
      }
  });
// Subsequent queries will use persistence, if it was enabled successfully
  
سریع
let settings = FirestoreSettings()
settings.isPersistenceEnabled = true

// Any additional options
// ...

// Enable offline data persistence
let db = Firestore.firestore()
db.settings = settings
هدف-C
FIRFirestoreSettings *settings = [[FIRFirestoreSettings alloc] init];
settings.persistenceEnabled = YES;

// Any additional options
// ...

// Enable offline data persistence
FIRFirestore *db = [FIRFirestore firestore];
db.settings = settings;
  

جاوا

FirebaseFirestoreSettings settings = new FirebaseFirestoreSettings.Builder()
        .setPersistenceEnabled(true)
        .build();
db.setFirestoreSettings(settings);

کوتلین + KTX

val settings = firestoreSettings {
    isPersistenceEnabled = true
}
db.firestoreSettings = settings

اندازه حافظه نهان را پیکربندی کنید

هنگامی که پایداری فعال باشد ، Cloud Firestore برای دسترسی آفلاین هر سندی را که از بخش عقب دریافت می کند ، ذخیره می کند. Cloud Firestore یک آستانه پیش فرض برای اندازه حافظه نهان تعیین می کند. پس از بیش از حد پیش فرض ، Cloud Firestore به طور دوره ای سعی در تمیز کردن اسناد قدیمی و استفاده نشده دارد. می توانید آستانه دیگری از اندازه حافظه نهان را پیکربندی کنید یا روند پاکسازی را کاملاً غیرفعال کنید:

وب
// The default cache size threshold is 40 MB. Configure "cacheSizeBytes"
// for a different threshold (minimum 1 MB) or set to "CACHE_SIZE_UNLIMITED"
// to disable clean-up.
firebase.firestore().settings({
  cacheSizeBytes: firebase.firestore.CACHE_SIZE_UNLIMITED
});

firebase.firestore().enablePersistence()
  
سریع
// The default cache size threshold is 100 MB. Configure "cacheSizeBytes"
// for a different threshold (minimum 1 MB) or set to "FirestoreCacheSizeUnlimited"
// to disable clean-up.
let settings = Firestore.firestore().settings
settings.cacheSizeBytes = FirestoreCacheSizeUnlimited
Firestore.firestore().settings = settings
هدف-C
// The default cache size threshold is 100 MB. Configure "cacheSizeBytes"
// for a different threshold (minimum 1 MB) or set to "kFIRFirestoreCacheSizeUnlimited"
// to disable clean-up.
FIRFirestoreSettings *settings = [FIRFirestore firestore].settings;
settings.cacheSizeBytes = kFIRFirestoreCacheSizeUnlimited;
[FIRFirestore firestore].settings = settings;
  

جاوا


// The default cache size threshold is 100 MB. Configure "setCacheSizeBytes"
// for a different threshold (minimum 1 MB) or set to "CACHE_SIZE_UNLIMITED"
// to disable clean-up.
FirebaseFirestoreSettings settings = new FirebaseFirestoreSettings.Builder()
        .setCacheSizeBytes(FirebaseFirestoreSettings.CACHE_SIZE_UNLIMITED)
        .build();
db.setFirestoreSettings(settings);

کوتلین + KTX


// The default cache size threshold is 100 MB. Configure "setCacheSizeBytes"
// for a different threshold (minimum 1 MB) or set to "CACHE_SIZE_UNLIMITED"
// to disable clean-up.
val settings = FirebaseFirestoreSettings.Builder()
        .setCacheSizeBytes(FirebaseFirestoreSettings.CACHE_SIZE_UNLIMITED)
        .build()
db.firestoreSettings = settings

به داده های آفلاین گوش دهید

در حالی که دستگاه آفلاین است ، اگر پایداری آفلاین را فعال کرده باشید ، هنگامی که داده های ذخیره شده در حافظه محلی تغییر می کند ، شنوندگان شما رویدادهای گوش دادن را دریافت می کنند. می توانید به اسناد ، مجموعه ها و پرس و جوها گوش دهید.

برای بررسی اینکه از سرور یا حافظه پنهان داده دریافت می کنید ، از ویژگی fromCache در SnapshotMetadata در رویداد عکس فوری خود استفاده کنید. اگر fromCache true ، داده ها از حافظه پنهان آمده اند و ممکن است کهنه یا ناقص باشند. اگر fromCache false ، داده ها با آخرین به روزرسانی ها در سرور کامل و جاری هستند.

اگر فقط SnapshotMetadata تغییر کند ، به طور پیش فرض هیچ رویدادی مطرح نمی شود. اگر به مقادیر fromCache تکیه می کنید ، هنگام ضمیمه کردن گوش دهنده ، گزینه includeMetadataChanges را گوش دهید.

وب
db.collection("cities").where("state", "==", "CA")
  .onSnapshot({ includeMetadataChanges: true }, function(snapshot) {
      snapshot.docChanges().forEach(function(change) {
          if (change.type === "added") {
              console.log("New city: ", change.doc.data());
          }

          var source = snapshot.metadata.fromCache ? "local cache" : "server";
          console.log("Data came from " + source);
      });
  });
 
سریع
// Listen to metadata updates to receive a server snapshot even if
// the data is the same as the cached data.
db.collection("cities").whereField("state", isEqualTo: "CA")
    .addSnapshotListener(includeMetadataChanges: true) { querySnapshot, error in
        guard let snapshot = querySnapshot else {
            print("Error retreiving snapshot: \(error!)")
            return
        }

        for diff in snapshot.documentChanges {
            if diff.type == .added {
                print("New city: \(diff.document.data())")
            }
        }

        let source = snapshot.metadata.isFromCache ? "local cache" : "server"
        print("Metadata: Data fetched from \(source)")
}
هدف-C
// Listen to metadata updates to receive a server snapshot even if
// the data is the same as the cached data.
[[[db collectionWithPath:@"cities"] queryWhereField:@"state" isEqualTo:@"CA"]
    addSnapshotListenerWithIncludeMetadataChanges:YES
    listener:^(FIRQuerySnapshot *snapshot, NSError *error) {
      if (snapshot == nil) {
        NSLog(@"Error retreiving snapshot: %@", error);
        return;
      }
      for (FIRDocumentChange *diff in snapshot.documentChanges) {
        if (diff.type == FIRDocumentChangeTypeAdded) {
          NSLog(@"New city: %@", diff.document.data);
        }
      }

      NSString *source = snapshot.metadata.isFromCache ? @"local cache" : @"server";
      NSLog(@"Metadata: Data fetched from %@", source);
    }];
  

جاوا

db.collection("cities").whereEqualTo("state", "CA")
        .addSnapshotListener(MetadataChanges.INCLUDE, new EventListener<QuerySnapshot>() {
            @Override
            public void onEvent(@Nullable QuerySnapshot querySnapshot,
                                @Nullable FirebaseFirestoreException e) {
                if (e != null) {
                    Log.w(TAG, "Listen error", e);
                    return;
                }

                for (DocumentChange change : querySnapshot.getDocumentChanges()) {
                    if (change.getType() == Type.ADDED) {
                        Log.d(TAG, "New city:" + change.getDocument().getData());
                    }

                    String source = querySnapshot.getMetadata().isFromCache() ?
                            "local cache" : "server";
                    Log.d(TAG, "Data fetched from " + source);
                }

            }
        });

کوتلین + KTX

db.collection("cities").whereEqualTo("state", "CA")
        .addSnapshotListener(MetadataChanges.INCLUDE) { querySnapshot, e ->
            if (e != null) {
                Log.w(TAG, "Listen error", e)
                return@addSnapshotListener
            }

            for (change in querySnapshot!!.documentChanges) {
                if (change.type == DocumentChange.Type.ADDED) {
                    Log.d(TAG, "New city: ${change.document.data}")
                }

                val source = if (querySnapshot.metadata.isFromCache)
                    "local cache"
                else
                    "server"
                Log.d(TAG, "Data fetched from $source")
            }
        }

داده آفلاین دریافت کنید

اگر در حالی که دستگاه آفلاین است سندی دریافت می کنید ، Cloud Firestore داده ها را از حافظه پنهان برمی گرداند.

هنگام استعلام از یک مجموعه ، در صورت عدم وجود اسناد ذخیره شده ، یک نتیجه خالی بازگردانده می شود. هنگام واکشی یک سند خاص ، به جای آن خطایی برمی گردد.

اطلاعات آفلاین را جستجو کنید

پرس و جو با ماندگاری آفلاین کار می کند. همانطور که در بخشهای قبلی توضیح داده شده است ، می توانید نتایج پرس و جوها را با دریافت مستقیم یا با گوش دادن بازیابی کنید. در حالی که دستگاه آفلاین است ، همچنین می توانید پرسشهای جدیدی بر روی دادههای محلی باقی مانده ایجاد کنید ، اما در ابتدا درخواستها فقط در برابر اسناد ذخیره شده اجرا می شوند.

دسترسی به شبکه را غیرفعال و فعال کنید

برای غیرفعال کردن دسترسی مشتری برای سرویس گیرنده Cloud Firestore می توانید از روش زیر استفاده کنید. در حالی که دسترسی به شبکه غیرفعال است ، همه شنوندگان عکس و درخواست سند نتایج را از حافظه پنهان بازیابی می کنند. عملیات نوشتن در صف هستند تا دسترسی مجدد شبکه فعال شود.

وب
firebase.firestore().disableNetwork()
    .then(function() {
        // Do offline actions
        // ...
    });
  
سریع
Firestore.firestore().disableNetwork { (error) in
    // Do offline things
    // ...
}
هدف-C
[[FIRFirestore firestore] disableNetworkWithCompletion:^(NSError *_Nullable error) {
  // Do offline actions
  // ...
}];
  

جاوا

db.disableNetwork()
        .addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                // Do offline things
                // ...
            }
        });

کوتلین + KTX

db.disableNetwork().addOnCompleteListener {
    // Do offline things
    // ...
}

برای فعال کردن مجدد دسترسی به شبکه ، از روش زیر استفاده کنید:

وب
firebase.firestore().enableNetwork()
    .then(function() {
        // Do online actions
        // ...
    });
  
سریع
Firestore.firestore().enableNetwork { (error) in
    // Do online things
    // ...
}
هدف-C
[[FIRFirestore firestore] enableNetworkWithCompletion:^(NSError *_Nullable error) {
  // Do online actions
  // ...
}];
  

جاوا

db.enableNetwork()
        .addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                // Do online things
                // ...
            }
        });

کوتلین + KTX

db.enableNetwork().addOnCompleteListener {
    // Do online things
    // ...
}