有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

云Firestore添加文档Android Studio时出现java问题

请帮我解决这个小问题

我有以下安卓代码:

private ArrayList serviceNameList = new ArrayList();

serviceNameList.add("windows");
serviceNameList.add("linux");
serviceNameList.add("mac");

然后,我使用firestore保存数据:

Map<String, Object> service = new HashMap<>();
            service.put("full_name", full_name.getText().toString());
            service.put("Services_names", Collections.singletonList(serviceNameList));

            firestore.collection("service").document("new_service")
                    .set(service)
                    .addOnSuccessListener(new OnSuccessListener<Void>() {
                        @Override
                            public void onSuccess(Void aVoid) {
                                Toast.makeText(getApplicationContext(), "Success..!",Toast.LENGTH_SHORT).show();
                            }
            })
                    .addOnFailureListener(new OnFailureListener() {
                        @Override
                            public void onFailure(@NonNull Exception e) {
                                String error = e.getMessage();
                                Toast.makeText(getApplicationContext(), "Error: " + error,Toast.LENGTH_SHORT).show();
                        }
            });

当我评论或删除此行时,所有工作正常:

service.put("Services_names",Collections.singletonList(serviceNameList));

但当我再次启用它时,我的应用程序失败了。。。我想知道我能做些什么来解决这个问题

谢谢你

顺便说一句,这是我的日志

2019-07-08 23:03:04.943 com.comas.app E: FATAL EXCEPTION: main
Process: com.comas.app, PID: 30989
java.lang.IllegalArgumentException: Invalid data. Nested arrays are not supported
    at com.google.firebase.firestore.core.UserData$ParseContext.createError(com.google.firebase:firebase-firestore@@19.0.2:293)
    at com.google.firebase.firestore.UserDataConverter.parseData(com.google.firebase:firebase-firestore@@19.0.2:270)
    at com.google.firebase.firestore.UserDataConverter.parseList(com.google.firebase:firebase-firestore@@19.0.2:307)
    at com.google.firebase.firestore.UserDataConverter.parseData(com.google.firebase:firebase-firestore@@19.0.2:272)
    at com.google.firebase.firestore.UserDataConverter.parseMap(com.google.firebase:firebase-firestore@@19.0.2:294)
    at com.google.firebase.firestore.UserDataConverter.parseData(com.google.firebase:firebase-firestore@@19.0.2:250)
    at com.google.firebase.firestore.UserDataConverter.convertAndParseDocumentData(com.google.firebase:firebase-firestore@@19.0.2:230)
    at com.google.firebase.firestore.UserDataConverter.parseSetData(com.google.firebase:firebase-firestore@@19.0.2:83)
    at com.google.firebase.firestore.DocumentReference.set(com.google.firebase:firebase-firestore@@19.0.2:175)
    at com.google.firebase.firestore.DocumentReference.set(com.google.firebase:firebase-firestore@@19.0.2:154)
    at com.comas.app.PopUpActivity$2.onClick(PopUpActivity.java:173)
    at 安卓.view.View.performClick(View.java:6663)
    at 安卓.view.View.performClickInternal(View.java:6635)
    at 安卓.view.View.access$3100(View.java:794)
    at 安卓.view.View$PerformClick.run(View.java:26199)
    at 安卓.os.Handler.handleCallback(Handler.java:907)
    at 安卓.os.Handler.dispatchMessage(Handler.java:105)
    at 安卓.os.Looper.loop(Looper.java:216)
    at 安卓.app.ActivityThread.main(ActivityThread.java:7593)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.安卓.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524)
    at com.安卓.internal.os.ZygoteInit.main(ZygoteInit.java:987)2019-07-08 23:03:04.955 ? E: FaultDetect: DUMPTOOL_PRINTF return.

共 (2) 个答案

  1. # 1 楼答案

    以下是将文件上载到firestore的代码

    FirebaseStorage storage = FirebaseStorage.getInstance();
    StorageReference storageReference = storage.getReference();
    
    private void uploadImage() {
            if (filePath != null) { //path of the file you want to upload
                final ProgressDialog dialog = new ProgressDialog(this);
                dialog.setTitle("Uploading...");
                dialog.show();
    
                StorageReference ref = storageReference.child("images/" + UUID.randomUUID().toString());
                ref.putFile(filePath)
                        .addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
                            @Override
                            public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                                dialog.dismiss();
                                System.out.println("image uploaded path " + taskSnapshot.getUploadSessionUri());
                                Toast.makeText(ListActivity.this, R.string.upload_success, Toast.LENGTH_LONG).show();
                            }
                        })
                        .addOnFailureListener(new OnFailureListener() {
                            @Override
                            public void onFailure(@NonNull Exception e) {
                                dialog.dismiss();
                                Toast.makeText(ListActivity.this, R.string.upload_failure, Toast.LENGTH_LONG).show();
                            }
                        })
                        .addOnProgressListener(new OnProgressListener<UploadTask.TaskSnapshot>() {
                            @Override
                            public void onProgress(UploadTask.TaskSnapshot taskSnapshot) {
                                double progress = (100.0*taskSnapshot.getBytesTransferred()/taskSnapshot
                                        .getTotalByteCount());
                                dialog.setMessage("Uploaded "+(int)progress+"%");
                            }
                        });
    
            }
        }
    
  2. # 2 楼答案

    如果要将ArrayList数据存储到Firestore中,请首先迭代整个ArrayList。然后,只将该变量传递到HashMap中

    private ArrayList serviceNameList = new ArrayList();
    
    serviceNameList.add("windows");
    serviceNameList.add("linux");
    serviceNameList.add("mac");
    
    Map<String, Object> service = new HashMap<>();
    service.put("full_name", full_name.getText().toString());
    service.put("Services_names", serviceNameList);
    

    Kotlin

    val serviceNameList = ArrayList<Any>()
    
    serviceNameList.add("windows")
    serviceNameList.add("linux")
    serviceNameList.add("mac")
    
    val service: MutableMap<String, Any> = HashMap()
    service["full_name"] = full_name.getText().toString()
    service["Services_names"] = serviceNameList