每当我使用addListenerForSingleValueEvent
时setPersistenceEnabled(true)
,我只能设法从服务器获取本地脱机副本DataSnapshot
而不是更新DataSnapshot
.
但是,如果我用addValueEventListener
用setPersistenceEnabled(true)
,我可以得到的最新副本DataSnapshot
从服务器.
这是正常的,addListenerForSingleValueEvent
因为它只搜索DataSnapshot
本地(离线)并在成功检索DataSnapshot
ONCE(离线或在线)后删除其侦听器?
从我删除数据后,我Firestore Database
需要花Android
app
一些时间才能意识到数据已被删除,并且我认为它是由于自动数据缓存而发生的.我的应用程序与离线使用无关,我想禁用此功能...
我在我的自定义中添加了这个Application Class
:
import android.app.Application;
import com.google.firebase.firestore.FirebaseFirestore;
import com.google.firebase.firestore.FirebaseFirestoreSettings;
public class ApplicationClass extends Application {
@Override
public void onCreate() {
super.onCreate();
FirebaseFirestore db=FirebaseFirestore.getInstance();
FirebaseFirestoreSettings settings = new FirebaseFirestoreSettings.Builder()
.setPersistenceEnabled(false)
.build();
db.setFirestoreSettings(settings);
}
}
Run Code Online (Sandbox Code Playgroud)
在关闭互联网连接后将问题重新打开(当应用程序仍在运行时,在后台或不在时) - Firestore module
似乎失去了与服务器的连接,并且它使得与预期的操作相反 - 而不是停止从缓存中获取数据,它从缓存中获取数据只.
例如,调试此代码将始终显示isFromCache
为true
且documentSnapshot
为空(即使server
侧面 - 它不是空的):
usersRef.document(loggedEmail).collection("challenges_received").get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
@Override
public void onSuccess(QuerySnapshot documentSnapshots) {
boolean isFromCache=documentSnapshots.getMetadata().isFromCache();
if (!documentSnapshots.isEmpty()) { …
Run Code Online (Sandbox Code Playgroud) 我想在应用程序启动时获取所需的应用程序版本号。但是我拿不到正确的钥匙。
我有这个代码要获取。我使用观察单个事件是因为我使用这种方法来检查所需的应用程序版本号。此方法仅在应用开始进行检查时触发。
func getVersion(completionHandler: @escaping (Result<Any?>) -> ()) {
let ref: DatabaseReference! = Database.database().reference().child("version").child("IOS")
ref?.observeSingleEvent(of: .value , with: { snapshot in
if snapshot.exists() {
let recent = snapshot.value as! NSDictionary
print(recent)
}
})
}
Run Code Online (Sandbox Code Playgroud)
但它正在返回旧的结果?我已isPersistenceEnabled
在我的Appdelegate
.
这是数据库结构:
当我使用Database.database().reference().child("version").child("IOS").
snapshot.exists时我没有得到任何结果, 当我使用它时。
我以前拥有的是: - 版本 | IOS - 1.0
当我使用Database.database().reference().child("version"), namely {iOS => 1.0}
. 我不明白,因为这是我的旧结构。
我使用Firebase来处理Android应用的Auth主题.我还在Firebase上保存了一个用户配置文件,其中包含用户ID和用户可以在Android应用中更新的额外选项.
启动时,应用程序会检查身份验证和身份验证.它重新加载用户配置文件(在Firebase上),然后在应用程序上更新我的userInstance.
Firebase在应用级别设置为离线功能.userInstance POJO在日志时与Firebase同步,并在unlog时停止同步.
我有一个特殊的参数,在我的用户配置文件中,我可以更改(作为管理员).
每次我在Firebase控制台上更新它时,它会在应用程序重新启动时替换为之前的值.
怎么会发生这种情况?
BTW:1 /如果多个客户端有不同的本地值,基于合并数据的机制?
这是更简单的代码,我试图重现错误.:
MyApplication.java
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
Firebase.setAndroidContext(this);
Firebase.getDefaultConfig().setLogLevel(Logger.Level.DEBUG);
Firebase.getDefaultConfig().setPersistenceEnabled(true);
}
}
Run Code Online (Sandbox Code Playgroud)
主要活动
public class MainActivity extends AppCompatActivity {
Firebase ref;
User user;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ref = new Firebase("https://millezim-test.firebaseIO.com").child("user");
ref.keepSynced(true);
Button br = (Button) findViewById(R.id.b_read);
Button bs = (Button) findViewById(R.id.b_save);
final TextView tv_r = (TextView) findViewById(R.id.tv_value_toread);
final EditText tv_s = (EditText) findViewById(R.id.tv_value_tosave);
user = new User();
bs.setOnClickListener(new View.OnClickListener() …
Run Code Online (Sandbox Code Playgroud)