本文介绍了Firebase Firestore分布式计数器文档代码崩溃的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在按照文档在Firebase Firestore中创建分布式计数器,但是,我在其提供的代码上遇到了错误.

I'm following the documentation to create a distributed counter in Firebase Firestore, however, I'm getting an error on their provided code.

// counters/${ID}
public class Counter {
    int numShards;

    public Counter(int numShards) {
        this.numShards = numShards;
    }
}

// counters/${ID}/shards/${NUM}
public class Shard {
    int count;

    public Shard(int count) {
        this.count = count;
    }
}

运行createCounter方法时,它们已经定义

When running the createCounter method they've defined

public Task<Void> createCounter(final DocumentReference ref, final int numShards) {
    // Initialize the counter document, then initialize each shard.
    return ref.set(new Counter(numShards))
            .continueWithTask(new Continuation<Void, Task<Void>>() {
                @Override
                public Task<Void> then(@NonNull Task<Void> task) throws Exception {
                    if (!task.isSuccessful()) {
                        throw task.getException();
                    }

                    List<Task<Void>> tasks = new ArrayList<>();

                    // Initialize each shard with count=0
                    for (int i = 0; i < numShards; i++) {
                        Task<Void> makeShard = ref.collection("shards")
                                .document(String.valueOf(i))
                                .set(new Shard(0));

                        tasks.add(makeShard);
                    }

                    return Tasks.whenAll(tasks);
                }
            });
}

我只是遇到了运行时异常

I simply get a Runtime Exception

E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: com.enterprises.optaku.bvalyan.gametalk, PID: 8471
                  java.lang.RuntimeException: No properties to serialize found on class com.enterprises.optaku.bvalyan.gametalk.TopicVotingFragment$Counter
                      at com.google.firebase.firestore.g.zzg$zza.<init>(SourceFile:643)
                      at com.google.firebase.firestore.g.zzg.zza(SourceFile:331)
                      at com.google.firebase.firestore.g.zzg.zzb(SourceFile:152)
                      at com.google.firebase.firestore.g.zzg.zza(SourceFile:1085)
                      at com.google.firebase.firestore.UserDataConverter.convertPOJO(SourceFile:427)
                      at com.google.firebase.firestore.DocumentReference.set(SourceFile:165)
                      at com.enterprises.optaku.bvalyan.gametalk.TopicVotingFragment.createCounter(TopicVotingFragment.java:217)
                      at com.enterprises.optaku.bvalyan.gametalk.TopicVotingFragment.lambda$null$5$TopicVotingFragment(TopicVotingFragment.java:180)

即使我序列化了类,当我增加计数器时,它们的代码中仍然有一个异常

Even when I serialize the classes, I still get an exception in their code when I go to increment the counter

Shard shard = transaction.get(shardRef).toObject(Shard.class);

编译器抱怨在Shard类中没有无参数的构造函数.

The compiler complains there is no no-argument constructor in the Shard class.

我在这里不知所措,因为这是我能找到的唯一文档.有人成功实现了这一点,知道我在这里可能会缺少什么吗?

I'm at a loss here, as this is the only documentation I can find. Has anyone implemented this successfully and know what I could be missing here?

推荐答案

如错误消息所述,您的Shard类没有无参数构造函数.JavaBean类型类必须具有无参数构造函数,以便无法完全理解其他构造函数做什么的代码将其实例化.因此,您应该在代码中添加一个无参数的构造函数:

As the error message says, your Shard class has no no-argument constructor. JavaBean type classes must have a no-argument constructor in order for it to be instantiated by code that can't fully understand what the other constructors do. So, you should add a no-arg constructor to your code:

public class Shard {
    int count;

    public Shard() {}  // this constructor has no arguments

    public Shard(int count) {
        this.count = count;
    }
}

如果没有该构造函数,则Firestore SDK无法以可预测的方式创建 Shard 的实例.

Without that constructor, the Firestore SDK doesn't have a predictable way to create instances of Shard.

这篇关于Firebase Firestore分布式计数器文档代码崩溃的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-29 15:09