Firestore getProductID 不能为空错误

Posted

技术标签:

【中文标题】Firestore getProductID 不能为空错误【英文标题】:Firestore getProductID cannot be null error 【发布时间】: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'

【问题讨论】:

【参考方案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()时仍然遇到同样的错误

以上是关于Firestore getProductID 不能为空错误的主要内容,如果未能解决你的问题,请参考以下文章

Firestore 查询正在返回数据,但 Futurebuilder 说它不能为空

为啥我不能将从 Firestore 获取的值分配给 Swift 中的数组?

init() 中的 Swift Array.append 不能与 Firestore (Google Cloud/FIrebase) 结合使用

Flutter-Firestore “参数类型 'Map<String, dynamic> Function()' 不能分配给参数类型 'Map<String, dynamic>

FireStore - 如何绕过数组“不包含”查询

如何为 Firestore 创建大量示例数据?