在Android应用程序上,必须在大多数时间离线工作,当它在线时,为ie做一些同步操作:
User myUser = MyclientFacade.getUser();
If (myUser.getScore > 10) {
DoSomething()
}
Run Code Online (Sandbox Code Playgroud)
用户是Firebase填写的POJO;
激活Firebase缓存时会出现此问题
Firebase.getDefaultConfig().setPersistenceEnabled(true);
Run Code Online (Sandbox Code Playgroud)
并且用户已经在缓存中,并且第三方(甚至是其他设备)在Firebase DB上更新数据.实际上,当我查询Firebase以获取用户时,我首先从缓存中获取数据,然后使用来自Firebase服务器的最新数据获取第二个更改事件,但为时已晚!
我们来看看同步方法MyclientFacade.getUser():
Public User getUser() {
Firebase ref = myFireBaseroot.child("User").child(uid);
ref.keepSynced(true);
/* try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}*/
final CountDownLatch signal = new CountDownLatch(1);
ref.addListenerForSingleValueEvent(new ValueEventListener() {
//ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
this.user = dataSnapshot.getValue(User.class);
signal.countDown();
}
@Override
public void onCancelled(FirebaseError firebaseError) {
signal.countDown();
}
});
signal.await(5, TimeUnit.SECONDS);
ref.keepSynced(false);
return this.user;
}
Run Code Online (Sandbox Code Playgroud)
如果我使用addValueEventListener或addListenerForSingleValueEvent …
作为firebase中的新手,我试图在这个简单的用例中模仿一种"where子句"请求来检索用户的钱包:
User
48bde8f8-3b66-40bc-b988-566ccc77335c
email: "toto@acme.com"
username: "userTest1"
UserWallet
F4PvtvNT2Z
coins: 26
someList
elemet1
elemet2
user: "48bde8f8-3b66-40bc-b988-566ccc77335c"
Run Code Online (Sandbox Code Playgroud)
首先,我尝试像这样编写我的请求:
Firebase root = new Firebase("https://myApp.firebaseio.com/");
Firebase ref = root.child("UserWallet");
Query query = ref.equalTo("48bde8f8-3b66-40bc-b988-566ccc77335c", "user");
Run Code Online (Sandbox Code Playgroud)
结果是null,所以我写了这个查询:
Query query = ref.orderByChild("user").equalTo("48bde8f8-3b66-40bc-b988-566ccc77335c", "user");
Run Code Online (Sandbox Code Playgroud)
结果再次为null.检索钱包的唯一方法是使用此查询:
Query query = ref.orderByChild("user").equalTo("48bde8f8-3b66-40bc-b988-566ccc77335c");
Run Code Online (Sandbox Code Playgroud)
那么在使用"equalTo()"之前我是否应该始终使用en"orderByChild()"查询?
那么,查询"equalTo(String value,String key)"与"equalTo(String value)"的目的是什么,因为只有第二个才能正常工作?
在使用Firebase的Android应用程序中,一旦Firebase返回查询答案,我需要在后台执行长时间操作.例如:
query.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot data) {
dosomething very long. . .
then call a callback forUI thread
}
Run Code Online (Sandbox Code Playgroud)
我知道firebase在异步模式下执行查询,但该onDataChange()方法似乎总是在主UI线程中执行,即使我尝试在自定义后台线程中调用查询.
有谁知道如何管理这个用例?
使用Firebase实时数据库,我们只需通过调用remove () 父节点就可以删除一个包含单个命令的大量项目(节点已被删除,所有节点也都是子节点).
但是根据Firestore的文档(https://firebase.google.com/docs/firestore/manage-data/delete-data#collections):
要删除一个Collection,我们必须编写一个将遍历所有它的批处理文件并逐一删除.
这根本没有效率.是因为Firestore是测试版还是在一次调用中删除整个节点(Collection)在结构上是不可能的?
我正在使用Spring Batch(3.0.1.RELEASE)/ JPA和HSQLBD服务器数据库.我需要浏览整个表(使用分页)和更新项目(逐个).所以我使用了jpaPagingItemReader.但是当我运行该作业时,我可以看到跳过了一些行,并且跳过的行数等于页面大小.因为,如果我的表有12行而jpaPagingItemReader.pagesize = 3,则作业将显示:第1,2,3行,然后第7,8,9行(所以跳过第4,5,6行)...你能告诉我是什么我的代码/配置有问题,或者这可能是HSQLDB分页的问题?以下是我的代码:
[编辑]:问题在于我的ItemProcessor执行对POJO实体的修改.由于JPAPagingItemReader在每次读取之间进行刷新,因此实体会更新((这就是我想要的).但似乎游标分页也会增加(如日志中所示:行ID 4,5和6已经过跳过).我该如何处理这个问题?
@Configuration
@EnableBatchProcessing(modular=true)
public class AppBatchConfig {
@Inject
private InfrastructureConfiguration infrastructureConfiguration;
@Inject private JobBuilderFactory jobs;
@Inject private StepBuilderFactory steps;
@Bean public Job job() {
return jobs.get("Myjob1").start(step1()).build();
}
@Bean public Step step1() {
return steps.get("step1")
.<SNUserPerCampaign, SNUserPerCampaign> chunk(0)
.reader(reader()).processor(processor()).build();
}
@Bean(destroyMethod = "")
@JobScope
public ItemStreamReader<SNUserPerCampaign> reader() String trigramme) {
JpaPagingItemReader reader = new JpaPagingItemReader();
reader.setEntityManagerFactory(infrastructureConfiguration.getEntityManagerFactory());
reader.setQueryString("select t from SNUserPerCampaign t where t.isactive=true");
reader.setPageSize(3));
return reader;
}
@Bean @JobScope
public ItemProcessor<SNUserPerCampaign, SNUserPerCampaign> processor() { …Run Code Online (Sandbox Code Playgroud)