将上传的数据上传到android studio上的firebase实时数据库时应用程序崩溃

Posted

技术标签:

【中文标题】将上传的数据上传到android studio上的firebase实时数据库时应用程序崩溃【英文标题】:App crashing while fetching uploaded data to firebase realtime database on android studio 【发布时间】:2020-03-19 18:09:47 【问题描述】:

我一直在尝试从 firebase 实时数据库中获取一些上传的数据,但应用不断崩溃。

我要从“Profile_Tab”到“Project_Creation_Activity”将数据上传到firebase。处理数据上传的代码如下所示

btnUpload.setOnClickListener(new View.OnClickListener()
        
            @Override
            public void onClick(View view)
            
                final ProgressDialog progressDialog=new ProgressDialog(Project_Creation_Activity.this);
                progressDialog.setMessage("Updating Info..");
                progressDialog.show();

                FirebaseUser currentUser=mAuth.getCurrentUser();

                if(projectTitle.getText().toString().equals(""))
                
                    Toasty.error(Project_Creation_Activity.this,"Project title missing",Toasty.LENGTH_SHORT,true).show();
                
                else
                
                    if(projectDescription.getText().toString().equals(""))
                    
                        Toasty.error(Project_Creation_Activity.this,"Project description missing",Toasty.LENGTH_SHORT,true).show();
                    
                    else
                    
                        String skill= Arrays.toString(skills);


                        //Adding project data to user
                         mDatabase.child("users").child(uid).child("userProjects").child(projectTitle.getText().toString()).child("projectTitle").setValue(projectTitle.getText().toString());
                         mDatabase.child("users").child(uid).child("userProjects").child(projectTitle.getText().toString()).child("skills").setValue(skill);
                         mDatabase.child("users").child(uid).child("userProjects").child(projectTitle.getText().toString()).child("projectDescription").setValue(projectDescription.getText().toString());
                         mDatabase.child("users").child(uid).child("userProjects").child(projectTitle.getText().toString()).child("leaderUid").setValue(uid);

                        //Adding data to project
                         mDatabase.child("projects").child(projectTitle.getText().toString()).child("projectTitle").setValue(projectTitle.getText().toString());
                         mDatabase.child("projects").child(projectTitle.getText().toString()).child("skills").setValue(skill);
                         mDatabase.child("projects").child(projectTitle.getText().toString()).child("projectDescription").setValue(projectDescription.getText().toString());
                         mDatabase.child("projects").child(projectTitle.getText().toString()).child("leaderUid").setValue(uid);

                        Toasty.success(Project_Creation_Activity.this,"Uploaded",Toasty.LENGTH_SHORT,true).show();
                        Intent intent=new Intent(Project_Creation_Activity.this,Social_Home_Activity.class);
                        startActivity(intent);
                        finish();
                    
                
                progressDialog.dismiss();
            
        );

这会将活动带到我尝试获取新数据的“个人资料”选项卡

mDatabase.child("users").child(currentUser.getUid()).child("userProjects").addChildEventListener(new ChildEventListener()
            @Override
            public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s)
            
                String title=(String)dataSnapshot.child("projectTitle").getValue();
                String description=(String)dataSnapshot.child("projectDescription").getValue();
                String skill=(String)dataSnapshot.child("skills").getValue();
                Log.i("Pratik",title);
                Log.i("Pratik",description);
                Log.i("Pratik",skill);
                Create_Project_Card(dataSnapshot.child("projectTitle").getValue().toString(),dataSnapshot.child("projectDescription").getValue().toString(),dataSnapshot.child("skills").getValue().toString(),view);
            

            @Override
            public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) 

            

            @Override
            public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) 

            

            @Override
            public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) 

            

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError)
            
                Log.i("Pratik",databaseError.getDetails());
            
        );

在我运行应用程序并上传任何内容后,应用程序崩溃,我必须重新启动应用程序。上传过程后,我检查了 Firebase 数据库中新上传的数据,但只有一半的数据被上传。我什至尝试在上传和 startActivity(intent) 之间添加延迟,以便上传完整的数据,但应用程序再次崩溃。该错误显示在我尝试从 firebase 获取数据的位置。它说我有一个空点异常。即使是完整的数据也会上传到 Firebase。我必须再次启动应用程序,然后上传数据。

这是我的数据库结构: enter image description here

崩溃的堆栈跟踪:

2019-11-24 11:40:16.347 15445-15445/com.example.collaborator E/androidRuntime: FATAL EXCEPTION: main
    Process: com.example.collaborator, PID: 15445
    java.lang.NullPointerException: println needs a message
        at android.util.Log.println_native(Native Method)
        at android.util.Log.i(Log.java:179)
        at com.example.collaborator.Profile_Tab$4.onChildAdded(Profile_Tab.java:511)
        at com.google.firebase.database.core.ChildEventRegistration.fireEvent(com.google.firebase:firebase-database@@16.0.4:79)
        at com.google.firebase.database.core.view.DataEvent.fire(com.google.firebase:firebase-database@@16.0.4:63)
        at com.google.firebase.database.core.view.EventRaiser$1.run(com.google.firebase:firebase-database@@16.0.4:55)
        at android.os.Handler.handleCallback(Handler.java:874)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:198)
        at android.app.ActivityThread.main(ActivityThread.java:6729)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

Profile_Tab 511 行是:Log.i("Pratik",description);

【问题讨论】:

请edit您的问题提供完整的stack trace from the crash。 这意味着description 为空。如果这是允许的,那么没有什么是真正的错误,那里。您只是不能将空值传递给 Log 方法。如果您仍然想记录它,那么您可以使用String.valueOf(description)"" + description 等。 是的,我明白了。我尝试上传所有数据,但在应用程序崩溃之前只有一半数据被上传。我什至尝试添加延迟来弥补缓慢的上传。我该如何解决这个问题?? 好吧,在我看来,您一次只更新一个值,所以当"projectTitle" 首先更新时,ChildEventListener 会触发,但其他值仍然为空。我对 Firebase 不是很熟悉,因此您可能应该等待该领域的专家出现,但我真的认为您可以一次更新整个孩子,而不是一次更新一个值。否则,请不要尝试像那样记录那些空值。 【参考方案1】:

firebase setValue() 方法是异步方法。因此,您的每个 setValue() 方法都将在后台线程中执行,并且无论是否在 Firebase 上发送所有数据,都会调用您的启动活动代码。最好制作一个模型类并在firebase上发送完整模型。因此,通过这种方式,所有项目将一起上传到 firebase。如果您需要代码方面的帮助,请告诉我。

【讨论】:

谢谢。它可以正常工作而不会崩溃。我刚刚为该项目创建了一个类,并获取了所有输入数据并一次全部上传。像魅力一样工作!

以上是关于将上传的数据上传到android studio上的firebase实时数据库时应用程序崩溃的主要内容,如果未能解决你的问题,请参考以下文章

无法通过我的 Android Studio 项目将数据上传到我的 Parse Server

Android Studio 将图像从 drawable 上传到 firebase 存储

Android Studio:将图像从 Android Studio 上传到 Cloudinary (https://cloudinary.com/)

Android Studio 将代码上传到代码托管平台

如何将文件上传到anonfile api android studio

将项目从 android studio 上传到 github