在启动时,应用程序会检查身份验证并重新加载用户配置文件(在Firebase上),然后更新应用程序中的userInstance。
Firebase被设置为应用程序级别的离线可用性。userInstance POJO与Firebase同步记录并在注销时停止同步。
我有一个特殊的参数,在我的用户配置文件中,我可以更改(作为管理员)。
每次我在Firebase控制台上更新它时,当应用程序再次启动时,它将被之前的值替换。
这是如何发生的?
另外: 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);
}
}
MainActivity
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() {
@Override
public void onClick(View v) {
if (!tv_s.getText().toString().equalsIgnoreCase(""))
user.setAge(Integer.valueOf(tv_s.getText().toString()));
ref.setValue(user);
}
});
br.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ref.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
User u = dataSnapshot.getValue(User.class);
if (u != null)
tv_r.setText(String.valueOf(u.getAge()));
else
tv_r.setText("Bad Value");
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
}
});
ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
User u = dataSnapshot.getValue(User.class);
u.setCounter(u.getCounter() + 1);
user = u;
saveUser();
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
}
public void saveUser() {
ref.setValue(user);
}
}
如果您只是更改应用中的某个值,那么计数器会一直增加,直到应用停止:这很正常。但是奇怪的是,年龄会循环地从旧的变成新的,然后再变成旧的,而且不会停止。
我在我的应用程序中看到了类似的行为(没有循环),因为我没有计数器,但我无法在管理客户端中更改参数,我总是得到存储在移动设备上的先前值。
我只需要进行身份验证,然后使用AuthData +从Firebase获取的用户更新我的UserInstance(可能是缓存数据),然后将更新后的用户保存回Firebase(因为我可能会得到新的AuthData,并且我通常会从Firebase获取最新的用户)
2 / 在这个简单的示例中,我发现如果在开始时读取该值,则会获取应用程序中缓存的数据。如何强制使用在线数据?