java - 无法将对象上传到 Firebase 实时数据库

标签 java android firebase real-time-data

我正在尝试将此对象上传到 Firebase 实时数据库:

public class DecorationRequest {    
    private String mName;
    private String mRooms;
    private String mBudget;
    private String mArea;
    private String mDescription;
    private List<Uri> mPhotoUrls;

    public DecorationRequest() {
        // Default constructor required for calls to DataSnapshot.getValue(User.class)
    }

    public DecorationRequest(String name, String rooms, String budget, String area, String description, List<Uri> photoUrls) {
        mName = name;
        mRooms = rooms;
        mBudget = budget;
        mArea = area;
        mDescription = description;
        mPhotoUrls = photoUrls;
    }

    public String getName() {
        return mName;
    }

    public void setName(String name) {
        mName = name;
    }

    public String getRooms() {
        return mRooms;
    }

    public void setRooms(String rooms) {
        mRooms = rooms;
    }

    public String getBudget() {
        return mBudget;
    }

    public void setBudget(String budget) {
        mBudget = budget;
    }

    public String getArea() {
        return mArea;
    }

    public void setArea(String area) {
        mArea = area;
    }

    public String getDescription() {
        return mDescription;
    }

    public void setDescription(String description) {
        mDescription = description;
    }

    public List<Uri> getPhotoUrls() {
        return mPhotoUrls;
    }

    public void setPhotoUrls(List<Uri> photoUrls) {
        mPhotoUrls = photoUrls;
    }
}

我有一个名为 FillInformationActivity 的 Activity ,其中包含以下代码:

mSubmitButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        if(checkFilledInformation()){
            DecorationRequest decorationRequest = new DecorationRequest(name,
                    mRoomsPicker.getText().toString(),
                    mEditBudget.getText().toString(),
                    mPickArea.getText().toString(),
                    mEditDescription.getText().toString(),
                    pictures);
            HelperTools.sendHelpRequest(mActivity, decorationRequest);
        }
    }
});

它调用了一个名为Helper tools的类中的方法,方法如下:

public static void sendHelpRequest(final AppCompatActivity activity, DecorationRequest decorationRequest){
    mRequestDatabaseReference.push().setValue(decorationRequest);
    List<Uri> pictures = decorationRequest.getPhotoUrls();
    for(int i = 0; i < pictures.size(); i++){
        final StorageReference photoRef = mChatPhotosStorageReference.child(pictures.get(i).getLastPathSegment());

        Task<Uri> urlTask = photoRef.putFile(pictures.get(i)).continueWithTask(new Continuation<UploadTask.TaskSnapshot, Task<Uri>>() {
            @Override
            public Task<Uri> then(@NonNull Task<UploadTask.TaskSnapshot> task) throws Exception {
                if(!task.isSuccessful()) {
                    throw task.getException();
                } else {
                    return photoRef.getDownloadUrl();
                }
            }
        }).addOnCompleteListener(new OnCompleteListener<Uri>() {
            @Override
            public void onComplete(@NonNull Task<Uri> task) {
                if(task.isSuccessful()){
                    Uri downloadUri = task.getResult();
                    ChatMessage chatMessage =
                            new ChatMessage(mUserName, getTime(), null, downloadUri.toString());
                    mMessagesDatabaseReference.push().setValue(chatMessage);
                } else {
                    Toast.makeText(activity.getApplicationContext(), "Failure", Toast.LENGTH_LONG).show();
                }
            }
        });
    }
}

最后是错误日志。它以大约 5000 行的循环开头:

at com.google.android.gms.internal.firebase_database.zzkt.zzi(Unknown Source)
at com.google.android.gms.internal.firebase_database.zzkt.zzi(Unknown Source) 
at com.google.android.gms.internal.firebase_database.zzkt.zzl(Unknown Source) 
at com.google.android.gms.internal.firebase_database.zzku.zzm(Unknown Source)

然后就这样结束了:

at com.google.firebase.database.DatabaseReference.zza(Unknown Source)
at com.google.firebase.database.DatabaseReference.setValue(Unknown Source) 
at com.example.tino.interiordecoration.HelperTools$override.sendHelpRequest(HelperTools.java:75)
at com.example.tino.interiordecoration.HelperTools$override.access$dispatch(HelperTools.java)
at com.example.tino.interiordecoration.HelperTools.sendHelpRequest(HelperTools.java)
at com.example.tino.interiordecoration.FillInformationActivity$2.onClick(FillInformationActivity.java:82)
at android.view.View.performClick(View.java:5706) 
at android.view.View$PerformClick.run(View.java:22822) 
at android.os.Handler.handleCallback(Handler.java:836) 
at android.os.Handler.dispatchMessage(Handler.java:103) 
at android.os.Looper.loop(Looper.java:203) 
at android.app.ActivityThread.main(ActivityThread.java:6301) 
at java.lang.reflect.Method.invoke(Native Method) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1084)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:945)

HelperTools 的第 75 行是这一行:

mRequestDatabaseReference.push().setValue(decorationRequest);

如果我将对象 DecorationRequest 更改为某个随机字符串,代码会运行,文件会上传到 Firebase 实时数据库,但显然这不是我想要的。

最佳答案

Uri 类不是 Firebase 支持的数据类型。 List 应该包含 String 对象而不是 Uri 对象。

当我简单地改变它时,我的代码就可以工作了

public List<Uri> getPhotoUrls() {
    return mPhotoUrls;
}

对此

public List<String> getPhotoUrls() {
        List<String> photoUrlStrings = new ArrayList<String>();
        for(int i=0; i<mPhotoUrls.size(); i++){
            photoUrlStrings.add(mPhotoUrls.get(i).toString());
        }
        return photoUrlStrings;
}

关于java - 无法将对象上传到 Firebase 实时数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51726066/

相关文章:

java - 当构建目标使用新 API 级别 21 时,Android 项目 fragment 转换抛出异常

android - EditText 不显示键盘

Android Flip Animation 从周围增长淡入,向周围收缩淡出?

android - 使用 Retrofit 自定义错误处理

android - 由于 META-INF 文件,Firebase MLKit 无法构建

android - 当应用程序在后台时,FCM 无法显示弹出窗口

java - 指定 DocumentBuilders 使用 DTD 进行 XML 解析?

java - 仅使用一台物理设备测试 Android 实时多人游戏

java - 找不到符号 Java 多维数组

typescript - 无法访问 Firebase Functions 项目中的全局方法