【发布时间】:2016-01-20 12:25:03
【问题描述】:
我使用 Firebase 来处理我的 Android 应用的 Auth 主题。 我还在 Firebase 上保存了一个用户配置文件,其中包含用户 ID 和用户可以在 Android 应用中更新的额外选项。
在启动时,应用程序会检查身份验证和身份验证。它重新加载用户配置文件(在 Firebase 上),然后在应用程序上更新我的 userInstance。
Firebase 在应用级别设置为可离线使用。 userInstance POJO 在 log 时与 Firebase 同步,在 unlog 时停止同步。
我的用户配置文件中有一个特殊参数,我可以更改(作为管理员)。
每次我在 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);
}
}
如果您只是更改应用程序中的值,则计数器会增加直到应用程序停止:这是正常的。但什么是链子,是时代从旧到新,再到旧的循环,没有停止。
我觉得我的应用程序中的行为没有循环,因为我没有计数器,但我无法更改管理客户端中的参数,我总是取回存储在移动设备中的先前值。
我只是 Auth,然后我用 AuthData 更新我的 UserInstance + 从 Firebase 获取的用户(可能是缓存的数据),然后我将更新后的用户保存在 Firebase 下(因为我可能得到新的 AuthData,我通常会得到Firebase 的最新用户)
2/ 在这个简单的示例中,我看到如果我在启动时读取值,它会获取应用程序中缓存的数据。如何强制拥有在线数据?
【问题讨论】:
-
不要描述您的代码,而是包含在问题中重现您的问题的最少代码。见stackoverflow.com/help/mcve
-
恕我直言,系统问题,因为概念问题并不总是用代码更好地解释?顺便说一句,我创建了一个简单的应用程序,触发了一个问题,这似乎与我的问题有关。
标签: java android database synchronization firebase