当前位置: 首页 > 知识库问答 >
问题:

如何使用Java将数据保存到Firebase(桌面)

狄玉书
2023-03-14

我正在尝试使用一个用Java编写的桌面应用程序将数据保存到Firebase。但是,由于某些原因,它不起作用,我一直在这里提供的文档:https://firebase.google.com/docs/database/admin/save-data。找不到任何视频教程的问题,所有视频都是网络或移动相关的。基本上,我想创建一个名为Venda的对象,它有3个属性(ID、data、valor),然后将它保存在FireBase上。谢谢!

主要方法如下:

public class Main {

    public static void main(String[] args) throws IOException, InterruptedException {
        System.out.println("--------- Begin of Output ---------");
        Firebase firebase = new Firebase();
        VendasCRUD venda = new VendasCRUD(firebase);
        venda.createVenda(new Venda(0, "23/05/1993", 45.67));
        System.out.println("----------- End of Output -----------");
    }

}

Firebase连接:

public class Firebase {

    public Firebase() throws FileNotFoundException, IOException {
        FileInputStream serviceAccount = new FileInputStream("C:\\Users\\Alex\\Documents\\NetBeansProjects\\SEMS\\src\\main\\java\\br\\com\\sems\\firebase\\sems-firebase.json");

        FirebaseOptions options = new FirebaseOptions.Builder()
                .setCredentials(GoogleCredentials.fromStream(serviceAccount))
                .setDatabaseUrl("https://sems-firebase.firebaseio.com/")
                .build();

        FirebaseApp.initializeApp(options);
    }

    public DatabaseReference getDataBaseReference() {
        return FirebaseDatabase.getInstance().getReference();
    }

}

Venda类:

public class Venda {

    public int ID;
    public String data;
    public double valor;

    public Venda(int ID, String data, double valor) {
        this.ID = ID;
        this.data = data;
        this.valor = valor;
    }

    @Override
    public String toString() {
        return ID + "," + data + "," + valor;
    }

}

数据库信息:

为了测试的目的,现在规则被设置为公共的。

更新:

好吧,在尝试了FrankVanPuffelen评论中的建议之后,我仍然无法保存或读取FireBase中的数据。为了测试的目的,我做了一个更简单的代码。代码如下:

public class Main {

    private static final String DATABASE_URL = "https://sems-firebase.firebaseio.com/";
    private static DatabaseReference database;
    private static boolean finished = false;

    public static void startListeners() {
        database.child("posts").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                Post post = dataSnapshot.getValue(Post.class);
                System.out.println(post);
                finished = true;
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
                System.out.println("The read failed: " + databaseError.getCode());
            }
        });
        while(!finished);
    }

    public static void main(String[] args) throws FileNotFoundException {

        try {
            FileInputStream serviceAccount = new FileInputStream("sems-firebase.json");
            FirebaseOptions options = new FirebaseOptions.Builder()
                    .setCredentials(GoogleCredentials.fromStream(serviceAccount))
                    .setDatabaseUrl(DATABASE_URL)
                    .build();



        FirebaseApp defaultApp =  FirebaseApp.initializeApp(options);
        FirebaseDatabase defaultDatabase = FirebaseDatabase.getInstance(defaultApp);

        System.out.println(defaultDatabase.getReference().toString());

    } catch (IOException e) {
        System.out.println("ERROR: invalid service account credentials. See README.");
        System.out.println(e.getMessage());

        System.exit(1);
    }

    // Shared Database reference
    database = FirebaseDatabase.getInstance().getReference();

    // Start listening to the Database
    startListeners();

}

}

所以我一直在做的是,我运行代码,然后转到数据库url并手动编辑一篇文章,我希望在控制台上得到我刚才编辑的文章的打印,但是什么也没有发生。

更新2

我相信这里提出的:为什么Firebase Java SDK不能在设置后终止?不推荐使用,因为如果我尝试,代码如下所示:

我试着把它修改成这样:

public static void startListeners() throws InterruptedException {
    DatabaseReference database = FirebaseDatabase.getInstance().getReference("posts/adad2131/author");
    CountDownLatch done = new CountDownLatch(1);
    database.setValue("Test", new DatabaseReference.CompletionListener() {
        @Override
        public void onComplete(DatabaseError de, DatabaseReference dr) {
            done.countDown();
        }
    });
    done.await();
}

但是onComplete方法永远不会执行,程序也永远不会完成。至于这里提出的内容:Java Firebase:延迟退出直到写入完成也可能不推荐使用,因为CompletionListener()似乎不再存在于Firebase中,但我可以在DatabaseReference中找到它,所以我将代码修改为:

private static final String DATABASE_URL = "https://sems-firebase.firebaseio.com/";

public static void startListeners() throws InterruptedException {
    DatabaseReference database = FirebaseDatabase.getInstance().getReference("posts/adad2131/author");
    final AtomicBoolean done = new AtomicBoolean(false);
    database.setValue("Test", new DatabaseReference.CompletionListener() {
        @Override
        public void onComplete(DatabaseError de, DatabaseReference dr) {
            done.set(true);
        }
    });
    while (!done.get());
}

与前面一样,onComplete方法永远不会被执行,程序永远不会完成或设置数据库中的数据。下面是我试图修改的帖子的快照:

更新3

因此我简化了代码以方便使用。为了确保我从项目的服务帐户面板生成了一个新的私钥,下面是我如何初始化应用程序的:

    try {
        FileInputStream serviceAccount = new FileInputStream("sems-firebase-firebase-adminsdk-gamnp-874087bbd1.json");
        FirebaseOptions options = new FirebaseOptions.Builder()
                .setCredentials(GoogleCredentials.fromStream(serviceAccount))
                .setDatabaseUrl("https://sems-firebase.firebaseio.com/")
                .build();

        FirebaseApp.initializeApp(options);

    } catch (IOException e) {
        System.out.println("ERROR: invalid service account credentials.");
        System.out.println(e.getMessage());

        System.exit(1);
    }

这里是数据库的快照,我试图更改的值是id为“adad2131”的post的author字段。

我尝试用“posts/adad2131/author”、“/posts/adad2131/author”或简单地“adad2131/author”引用该字段,也许我引用错了?

以下是完整的代码:

public class Main {

    public static void main(String[] args) throws FileNotFoundException, InterruptedException {

        try {
            FileInputStream serviceAccount = new FileInputStream("sems-firebase-firebase-adminsdk-gamnp-874087bbd1.json");
            FirebaseOptions options = new FirebaseOptions.Builder()
                    .setCredentials(GoogleCredentials.fromStream(serviceAccount))
                    .setDatabaseUrl("https://sems-firebase.firebaseio.com/")
                    .build();

            FirebaseApp.initializeApp(options);

        } catch (IOException e) {
            System.out.println("ERROR: invalid service account credentials.");
            System.out.println(e.getMessage());

            System.exit(1);
        }

        //Try to change data in Firebase
        CountDownLatch done = new CountDownLatch(1);
        FirebaseDatabase.getInstance().getReference("posts/adad2131/author").setValue("Test", new DatabaseReference.CompletionListener() {
            @Override
            public void onComplete(DatabaseError de, DatabaseReference dr) {
                done.countDown();
            }
        });
        done.await();

    }
}

ps.我也在使用admin sdk 5.9

共有1个答案

欧阳鸿哲
2023-03-14

我只是使用Firebase Admin SDK5.9将您的代码复制到一个项目中并运行它,它写入数据库时没有任何问题。

CountDownLatch done = new CountDownLatch(1);
FirebaseDatabase.getInstance().getReference("49723347").setValue("Test", new DatabaseReference.CompletionListener() {
    @Override
    public void onComplete(DatabaseError de, DatabaseReference dr) {
        done.countDown();
    }
});
done.await();

您可以在这里看到结果:https://stackoverflow.firebaseio.com/49723347.json

引用49723347是我的数据库中的路径(它是您的问题的ID)。我没有做其他改变。

所以问题似乎不在我们一直在看的代码中。以下是我初始化应用程序的方法:

FileInputStream serviceAccount = new FileInputStream("stackoverflow-3d9889aaeddb.json");

FirebaseOptions options = new FirebaseOptions.Builder()
        .setCredential(FirebaseCredentials.fromCertificate(serviceAccount))
        .setDatabaseUrl("https://stackoverflow.firebaseio.com/")
        .build();

FirebaseApp.initializeApp(options);

您确定该配置是要编写的项目的配置吗?

 类似资料:
  • 我正试图从解析通过模拟器中提取一个PDF文件,并保存到我的桌面上,当我的应用程序上的一个按钮被点击时。问题是,无论我做什么,文件不会出现在桌面或其他任何地方。我正在对下载按钮使用此方法 无法将其保存到桌面。

  • 我创建了一个简单的应用程序,裁剪图像。现在我想保存这个图像到消防基地。 如何将此图像保存到Firebase。我尝试了很多教程,但都没有成功。请用简单的代码验证。

  • 我有一个小应用程序,用户可以根据球员最近在各种运动中的表现,对他们进行升票或降票。 当upvote按钮当前被点击时,投票者的UID(通过Google登录)应该被推入被投票的相应玩家的数据库中。像这样: 下面是执行Firebase工作的代码。我相信我错了其中一句台词。

  • 问题内容: 检索数据有效,但是我无法将检索到的数据保存到ArrayList中。在“ onDataChanged()”方法之后,ArrayList“配置文件”似乎具有2个值,但在return语句中它具有0个值。 问题答案: 您现在无法返回尚未加载的内容。换句话说,您不能简单地在方法之外返回列表,因为它总是由于该方法的异步行为而引起的。这意味着,当您尝试返回该方法之外的结果时,数据尚未完成从数据库的加

  • Im使用firebase,由于某些原因,我的代码没有推送数据,并且Im没有在firebase URL中看到数据。我的密码是这样的 我得到警报“保存”,但我无法在firebase URL中找到数据。 此外,为Firebase中的每个url提供的API键有什么用途。 更新:这种情况发生在IE10中。在其他浏览器中,它工作得很好

  • 问题内容: 我有一个Java类,正在使用iText库生成PDF文件。现在,根据我的需要,我必须将生成的PDF文件保存到MySQL数据库表中,但是我不知道该怎么做。 我担心的是: 我应该在PDF表的MySQL列中使用哪种 数据类型 来保存PDF文件 哪个查询会将生成的PDF文件插入数据库 目前,我正在生成PDF文件,并将其存储到本地磁盘的硬编码文件路径中。 这是我的Java PDF生成代码: 请帮我