【问题标题】:Firestore getProductID cannot be null errorFirestore getProductID 不能为空错误
【发布时间】:2018-03-15 19:36:28
【问题描述】:

我正在尝试在我的 Android 应用中使用 Firebase 发布的新 Firestore。不幸的是,我在尝试写入数据库时​​不断收到此错误。

public class MainActivity extends AppCompatActivity {

EditText txtName,txtSurname;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar =  findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

    txtName = findViewById(R.id.Name);
    txtSurname = findViewById(R.id.Surname);

    FloatingActionButton fab = findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            FirebaseFirestore db = FirebaseFirestore.getInstance();

            Map<String, Object> user = new HashMap<>();
            user.put("first", "Ada");
            user.put("last", "Lovelace");
            user.put("born", 1815);

            db.collection("users")
                    .add(user)
                    .addOnSuccessListener(new OnSuccessListener<DocumentReference>() {
                        @Override
                        public void onSuccess(DocumentReference documentReference) {
                            //Log.d(TAG, "DocumentSnapshot added with ID: " + documentReference.getId());
                        }
                    })
                    .addOnFailureListener(new OnFailureListener() {
                        @Override
                        public void onFailure(@NonNull Exception e) {
                            //Log.w(TAG, "Error adding document", e);
                        }
                    });

        }
    });
}

这是我不断收到的错误。我已通过助手将该项目添加到我的 android 应用程序中。所以应该没有问题。

进程:该死的.testapp,PID:2622
java.lang.IllegalArgumentException: FirebaseOptions.getProjectId() 不能为空 com.google.firebase.firestore.FirebaseFirestore.zze(未知来源)在 com.google.firebase.firestore.FirebaseFirestore.getInstance(未知 来源)在damn.testapp.MainActivity$1.onClick(MainActivity.java:44) 在 android.view.View.performClick(View.java:5637) 在 android.view.View$PerformClick.run(View.java:22429) 在 android.os.Handler.handleCallback(Handler.java:751) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:154) 在 android.app.ActivityThread.main(ActivityThread.java:6119) 在 java.lang.reflect.Method.invoke(Native Method) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

任何帮助将不胜感激。

这是我的数据库安全规则

service cloud.firestore {
  match /databases/{database}/documents {
match /{document=**} {
  allow read, write;
    }
  }
}

这是我正在使用的依赖项:

    compile 'com.google.firebase:firebase-firestore:11.4.2'

【问题讨论】:

    标签: java android firebase google-cloud-firestore


    【解决方案1】:

    我有

    buildscript {
        dependencies {
            classpath 'com.google.gms:google-services:4.2.0'
        }
    }
    

    并且解决方案在 FirebaseOptions .setProjectId(prjID) 的构造函数中

        String projectID = "project-id-com";
        FirebaseOptions options = new FirebaseOptions.Builder()
                .setApplicationId("1:26000034:android:6d45000000534")
                .setApiKey("AIzaSyAbsrv0000000000eml95vFOs")
                .setDatabaseUrl("https://" + projectID + ".firebaseio.com")
                .setProjectId(projectID)
                .build();
    
        FirebaseApp.initializeApp(context, options, projectID);
        FirebaseApp app = FirebaseApp.getInstance(projectID);
        FirebaseFirestore db = FirebaseFirestore.getInstance(app);
    
        Map<String, Object> city = new HashMap<>();
        city.put("name", "Los Angeles");
        city.put("state", "CA");
        city.put("country", "USA");
    
        db.collection("documents")
                .document("example")
                .set(city)
                .addOnSuccessListener(documentReference ->
                            Log.d(TAG, "DocumentSnapshot added with ID: " ))
                .addOnCompleteListener(ab ->
                            Log.d(TAG, "complete: "))
                .addOnFailureListener(e ->
                            Log.d(TAG, "Error adding document", e));
    

    【讨论】:

      【解决方案2】:

      这是发送包含“null”值的键的问题。尝试用空字符串“”替换键值。

      【讨论】:

      • 请给出代码示例,我尝试过的方式似乎没有解决问题
      【解决方案3】:

      sokarcreative 答案对我不起作用。我这样做了:

      buildscript {
      
          repositories {
              google()
              jcenter()
          }
          dependencies {
              classpath 'com.android.tools.build:gradle:3.0.1'
              classpath 'com.google.gms:google-services:3.1.1'
          }
      }
      
      allprojects {
          repositories {
              google()
              jcenter()
              maven {
                  url "https://maven.google.com" // Google's Maven repository
              }
          }
      }
      
      task clean(type: Delete) {
          delete rootProject.buildDir
      }
      

      【讨论】:

        【解决方案4】:

        如果您有一个 google-services.json 文件,但它在 project_info 部分中没有 project_id 键,则可能会发生此故障。

        如果您将 Firestore 添加到具有较旧 google-services.json 文件的现有应用,则可能会发生这种情况。项目 ID 是该文件中相对较新的字段,添加以支持 Firestore。

        登录 Firebase 控制台,在其中找到您的应用,重新下载 google-services.json 文件,将其替换到您的项目中,然后就可以开始了。

        【讨论】:

        • 我只是这样做了,还卸载了应用程序,清除了数据和缓存,什么也没有。它仍然给我IllegalArgumentException: FirebaseOptions.getProjectId() cannot be null 我正在检查我的project_info 它有正确的project_id
        • 是否有可能您没有在构建中使用 google-services 插件?见firebase.google.com/docs/android/…底部的步骤
        • 问题出在我的 google-services 版本上。我刚刚将其升级到 3.1.0 并且可以正常工作
        【解决方案5】:

        我遇到了同样的问题。 在 gradle 中解决了这个问题: 3.0.0 到 3.1.0

        buildscript {
            dependencies {
                classpath 'com.google.gms:google-services:3.1.0'
            }
        }
        

        【讨论】:

        • 你是怎么发现这个的?
        • 和你一样,我正在寻找答案。我在另一篇帖子中注意到 com.google.gms:google-services 最高为 3.1.0。我刚试过,看看会发生什么。
        • @sokarcreative 谢谢你!让我免于在墙上再打一个洞!
        【解决方案6】:

        这是导致问题的原因。

        FirebaseFirestore db = FirebaseFirestore.getInstance();
        

        相反,像这样使用它:

        private DocumentReference documentReference = FirebaseFirestore.getInstance().document("sampleData/myData");
        

        然后像这样保存数据;

            Map<String, Object> user = new HashMap<>();
            user.put("first", "Ada");
            user.put("last", "Lovelace");
            user.put("born", 1815);
            documentReference
                    .set(user).addOnSuccessListener(new OnSuccessListener<Void>() {
                @Override
                public void onSuccess(Void aVoid) {
                    Log.d("MainActivity", "DocumentSnapshot added with ID: " + documentReference.getId());
                }
            });
        

        【讨论】:

        • 您是否在 Firebase 控制台中修改了数据库安全规则并添加了 Firestore 依赖项?
        • 我拥有最新的数据库依赖和解锁的安全规则。
        • 它没有得到那个代码。声明文档引用时,应用在此之前崩溃。
        • 是的,就是这样。
        • 我在做_firestore = FirebaseFirestore.getInstance()时仍然遇到同样的错误
        猜你喜欢
        • 2019-05-14
        • 2015-11-07
        • 1970-01-01
        • 1970-01-01
        • 2019-02-28
        • 2014-01-30
        • 2017-12-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多