簡體   English   中英

Firebase firestore 變量名稱已更改

[英]Firebase firestore variable name changed

我的 firestore 變量以其他名稱保存在 Cloud firestore 中。 我認為這與混淆器有關,但我不明白。

以下是我的用戶名。

public String id;
public String name;
public String number;
public String profilePic;
public String shopPic;

以下是屏幕截圖,保存在 firestore 上的內容。 SC

下面是一些相關的代碼,很簡單

        FirestoreUrls.get().getAccountsCollection()
                .document().set(binding.getUser()).addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                hideProgressBar();
                handleFirebaseException(getClass(), task, true);
            }
        });

您遇到此問題是因為您使用 Proguard 來確保安全性,它會打亂代碼,因此在您創建應用程序的 APK 后其他人無法立即看到它。 這也適用於 Firebase。 要解決此問題,請在build.gradle文件中添加以下代碼行:

buildTypes {
    release {
        minifyEnabled true
        shrinkResources true
        proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
    }
}

然后在項目的 Proguard 文件中添加以下規則,以通過將包名稱替換為您自己的包名稱來防止該行為:

-keepattributes Signature //Global rule

-keepclassmembers class com.example.YourModelClass.** {
  *;
}

請查看文檔以獲取更多信息:

proguard將字段和類名重命名為更短的名稱。 為了防止這種情況,您可以使用proguard-android.txt文件中的"-keep class com.package.MyClass"行將此類從 proguard 優化中排除。

但是恕我直言,您應該在代碼中的某個位置將變量映射到正確的字符串,然后將字符串發送到雲存儲。 因為現在您的類中的任何重構(例如重命名字段)都可能會破壞您的 Firestore 名稱匹配。

更新

看起來您可以通過這種方式將對象文件映射到正確的字符串:

User user = binding.getUser()

Map<String, Object> docData = new HashMap<>();
docData.put("id", user.id);
docData.put("name", user.name);
docData.put("number", user.number);
docData.put("profilePic", user.profilePic);
docData.put("shopPic", user.shopPic);

FirestoreUrls.get().getAccountsCollection()
                .document().set(docData)...
  • 好的,所以我遇到了完全相同的問題,這就是我為解決它所做的。

解決方案:

  • Go 在你的 proguard-rules.pro 文件中並粘貼:
# Add this global rule
    -keepattributes Signature
-keep class <Your class package here>.** { *; }

  • <Your class package here>可以在 class 文件中找到:
package com.elliottsoftware.calftracker.domain.models.fireBase


//TODO THE GETTERS AND SETTERS USED BY FIREBASE ARE CASE SENSITIVE
data class FireBaseCalf(var calftag: String? = null,
                        var cowtag:String? = null,
                        var ccianumber: String? = null,
                        var sex:String? = null,
                        var details:String?=null,
                        var date: Date? = null,
                        var birthweight:String? = null,
                        var id: String? = null,

                        ) {
    // Null default values create a no-argument default constructor, which is needed
    // for deserialization from a DataSnapshot.
}

  • 注意com.elliottsoftware.calftracker.domain.models.fireBase ,這就是您要替換為<Your class package here>

  • 所以最后你的 proguard-rules.pro 文件將如下所示:

# Add this global rule
    -keepattributes Signature

    -keep class com.elliottsoftware.calftracker.domain.models.fireBase.** { *; }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM