Firebase Firestore变量名称已更改

liwlm1x9  于 2023-01-31  发布在  其他
关注(0)|答案(3)|浏览(129)

我的firestore变量在cloud firestore里面用别的名字保存了,我想这和proguard有关,但是我没有得到。
以下是我的用户名。

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

下面是屏幕截图,显示了保存在firestore.

上的内容
下面是一些相关的代码,非常简单

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

fumotvh31#

您遇到此问题是因为您使用的是出于安全考虑的Profuard,它会打乱代码,以便其他人无法在您创建应用的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.** {
  *;
}

请查看文档以了解更多信息:

  • https://firebase.google.com/docs/database/android/start#proguard
rta7y2nd

rta7y2nd2#

proguard将字段和类名重命名为较短的名称。要防止出现这种情况,可以使用proguard-android.txt文件中的"-keep class com.package.MyClass"行将此类从proguard优化中排除。
但是恕我直言,你应该在代码的某个地方把你的变量Map到合适的字符串,然后把字符串发送到云firestore,因为现在你类中的任何重构(比如重命名字段)都可能破坏你的firestore名称匹配。

    • 更新**:

看起来你可以用这种方法将对象字段Map到合适的字符串:

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)...
lsmepo6l

lsmepo6l3#

  • 好吧,我遇到了同样的问题,这就是我解决它的方法。

溶液:

  • 进入您的www.example.com文件并粘贴此:proguard-rules.pro file and paste this:
# Add this global rule
    -keepattributes Signature
-keep class <Your class package here>.** { *; }
  • <Your class package here>可以在类文件中找到:
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>的内容
  • 所以最后你的www.example.com文件看起来像这样:proguard-rules.pro file will look like this:
# Add this global rule
    -keepattributes Signature

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

相关问题