Сбой приложения с использованием collection.add () с Firestore - PullRequest
0 голосов
/ 14 ноября 2018

Я новичок в разработке для Android, поэтому, пожалуйста, прости меня, если это звучит довольно банально или слишком долго, но я застрял, пытаясь добавить элементы в коллекцию в Firestore.

Я читал где-то в разделе комментариев учебника, который произошел ниже API 25 (я использую 24), но я не уверен, почему.

Вот часть моего кода:

FirebaseFirestore db;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_registro);

    FirebaseFirestore firestore = FirebaseFirestore.getInstance();
    FirebaseFirestoreSettings settings = new FirebaseFirestoreSettings.Builder()
            .setTimestampsInSnapshotsEnabled(true)
            .build();
    firestore.setFirestoreSettings(settings);

    db = FirebaseFirestore.getInstance();
}

public void sendInfo(View view){
        CollectionReference dbArtists = db.collection("artistas");
        Artist a = new Artist("0", "A", 10);
        dbArtists.add(a)
    }

sendInfo связан с кнопкой, которая работает нормально. Линия, которая вылетает из приложения,

dbArtists.add(a)

Итак, у logcat было предупреждение:

com.esiete.anapptitle W/Firestore: (0.6.6-dev) [Firestore]: The behavior for java.util.Date objects stored in Firestore is going to change AND YOUR APP MAY BREAK.
To hide this warning and ensure your app does not break, you need to add the following code to your app before calling any other Cloud Firestore methods:

FirebaseFirestore firestore = FirebaseFirestore.getInstance();
FirebaseFirestoreSettings settings = new FirebaseFirestoreSettings.Builder()
    .setTimestampsInSnapshotsEnabled(true)
    .build();
firestore.setFirestoreSettings(settings);

With this change, timestamps stored in Cloud Firestore will be read back as com.google.firebase.Timestamp objects instead of as system java.util.Date objects. So you will also need to update code expecting a java.util.Date to instead expect a Timestamp. For example:

// Old:
java.util.Date date = snapshot.getDate("created_at");
// New:
Timestamp timestamp = snapshot.getTimestamp("created_at");
java.util.Date date = timestamp.toDate();

Please audit all existing usages of java.util.Date when you enable the new behavior. In a future release, the behavior will be changed to the new behavior, so if you do not follow these steps, YOUR APP MAY BREAK.

Сбои по-прежнему остаются после добавления кода, как показано выше. Logcat показывает:

8-11-13 21:44:09.290 30030-30030/com.esiete.anapptitle D/AndroidRuntime: Shutting down VM
2018-11-13 21:44:09.294 30030-30030/com.esiete.anapptitle E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.esiete.anapptitle, PID: 30030
    java.lang.IllegalStateException: Could not execute method for android:onClick
        at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:390)
        at android.view.View.performClick(View.java:5612)
        at android.view.View$PerformClick.run(View.java:22285)
        at android.os.Handler.handleCallback(Handler.java:751)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6123)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757)
     Caused by: java.lang.reflect.InvocationTargetException
        at java.lang.reflect.Method.invoke(Native Method)
        at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:385)
        at android.view.View.performClick(View.java:5612) 
        at android.view.View$PerformClick.run(View.java:22285) 
        at android.os.Handler.handleCallback(Handler.java:751) 
        at android.os.Handler.dispatchMessage(Handler.java:95) 
        at android.os.Looper.loop(Looper.java:154) 
        at android.app.ActivityThread.main(ActivityThread.java:6123) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757) 
     Caused by: java.lang.RuntimeException: No properties to serialize found on class com.esiete.anapptitle.Artist
        at com.google.firebase.firestore.g.zzg$zza.<init>(SourceFile:643)
        at com.google.firebase.firestore.g.zzg.zza(SourceFile:331)
        at com.google.firebase.firestore.g.zzg.zzb(SourceFile:152)
        at com.google.firebase.firestore.g.zzg.zza(SourceFile:1085)
        at com.google.firebase.firestore.UserDataConverter.convertPOJO(SourceFile:421)
        at com.google.firebase.firestore.CollectionReference.add(SourceFile:125)
        at com.esiete.anapptitle.RegistroActivity.enviarRegistro(RegistroActivity.java:82)
        at java.lang.reflect.Method.invoke(Native Method) 
        at android.support.v7.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:385) 
        at android.view.View.performClick(View.java:5612) 
        at android.view.View$PerformClick.run(View.java:22285) 
        at android.os.Handler.handleCallback(Handler.java:751) 
        at android.os.Handler.dispatchMessage(Handler.java:95) 
        at android.os.Looper.loop(Looper.java:154) 
        at android.app.ActivityThread.main(ActivityThread.java:6123) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757) 
2018-11-13 21:44:09.298 4088-5186/? W/ActivityManager:   Force finishing activity com.esiete.anapptitle/.RegistroActivity
2018-11-13 21:44:09.306 4088-30868/? W/DropBoxManagerService: Dropping: data_app_crash (1752 > 0 bytes)

Любая помощь или советы очень приветствуются.

РЕДАКТИРОВАТЬ: Добавление кода класса Artist.

package com.esiete.anapptitle;

public class Artist {
    private String artistID;
    private String name;
    private int sales;

    public Artist() {
    }

    public Artist(String artistID, String name, int sales) {
        this.artistID = artistID;
        this.name = name;
        this.sales = sales;
    }
}

1 Ответ

0 голосов
/ 14 ноября 2018

Ваш класс Artist не имеет информации о том, что Firebase знает, как сериализовать базу данных и из нее. Чтобы он знал это, класс должен иметь открытые поля или публичные методы получения и установки.

Скажите, что документ Artist в вашей базе данных имеет три поля:

artistId: "0"
name: "A"
sales: 10

Это означает, что вам нужен либо этот класс Java:

public class Artist {
    public String artistId;
    public String name;
    public long sales;
}

Каждое открытое поле здесь соответствует точному имени поля документа в базе данных, что позволяет клиенту Firebase читать / записывать правильные значения.

В качестве альтернативы вы можете иметь этот класс Java:

public class Artist {
    String artistId;
    String name;
    long sales;

    public Artist() {} // Empty constructor is required
    public Artist(String artistId, String name, long sales) {
        this.artistId = artistId;
        this.name = name;
        this.sales = sales;
    }

    public String getArtistId() { return this.artistId; }
    public void setArtistId(String artistId) { this.artistId = artistId; }
    public String getName() { return this.name; }
    public void setName(String name) { this.name = name; }
    public long getRanking() { return this.ranking; }
    public void setRanking(long ranking) { this.ranking = ranking; }
}

Этот второй класс следует соглашениям об именах JavaBean, что означает, что getId/setId определяет свойство id, которое снова совпадает с точным именем поля в базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...