不是 GenericTypeIndicator 的直接子类:类 com.google.firebase.database.GenericTypeIndicator

问题描述 投票:0回答:3

我有带有实时数据库的 Firebase 应用程序,我有 db.json

{
  "brs" : {
    "route": [
      {
        "routeDestination": "DDDD1",
        "routeOrigin": "OOOO1",
        "bus" : {
            "busArrivalTime" : "created_at_timestamp",
            "busDepartureTime" : "created_at_timestamp",
            "busName" : "SOME NAME",
            "busSeatCost" : "0000",
            "busTotalSeats" : "000",
            "reservations": [
              {
                "reservationId": 1,
                "reservationDate": "Wed Jul 06 23:54:56 EDT 2016",
                "seats": [
                  {                
                    "seatNumber": 1
                  },
                  {               
                    "seatNumber": 2
                  }
                ]
              }
            ] 
        }            
      },
      {
        "routeDestination": "DDDD2",
        "routeOrigin": "OOOO2",
        "bus" : {
            "busArrivalTime" : "created_at_timestamp",
            "busDepartureTime" : "created_at_timestamp",
            "busName" : "SOME NAME",
            "busSeatCost" : "0000",
            "busTotalSeats" : "000",
            "reservations": [
              {
                "reservationId": 1,
                "reservationDate": "Wed Jul 06 23:54:56 EDT 2016",
                "seats": [
                  {                
                    "seatNumber": 1
                  },
                  {               
                    "seatNumber": 2
                  }
                ]
              }
            ] 
        }            
      },
      {
        "routeDestination": "DDDD3",
        "routeOrigin": "OOOO3",
        "bus" : {
            "busArrivalTime" : "created_at_timestamp",
            "busDepartureTime" : "created_at_timestamp",
            "busName" : "SOME NAME",
            "busSeatCost" : "0000",
            "busTotalSeats" : "000",
            "reservations": [
              {
                "reservationId": 1,
                "reservationDate": "Wed Jul 06 23:54:56 EDT 2016",
                "seats": [
                  {                
                    "seatNumber": 1
                  },
                  {               
                    "seatNumber": 2
                  }
                ]
              }
            ] 
        }            
      }
    ]
  }
}

现在在android应用程序中我想检索列表中的路线

button.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(final View view) {
        FirebaseDatabase firebaseDatabase = FirebaseDatabase.getInstance();
        DatabaseReference myRef = firebaseDatabase.getReference("route");

        try {

            // Read from the database
            myRef.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    // This method is called once with the initial value and again
                    // whenever data at this location is updated.
                    GenericTypeIndicator t = new GenericTypeIndicator () {};
                    List<Object> routes = (List<Object>) dataSnapshot.getValue(t);

                    if( routes == null ) {
                        Snackbar.make(view, "No value  " ,Snackbar.LENGTH_LONG).setAction("Action", null).show();
                    }
                    else {
                        Snackbar.make(view, "The routes Size is " + routes.size(), Snackbar.LENGTH_LONG)
                                .setAction("Action", null).show();

                    }                        
                }

                @Override
                public void onCancelled(DatabaseError error) {
                    // Failed to read value
                    Log.w("BUS_TAG", "Failed to read value.", error.toException());
                }
            });
        } catch (Exception e) {
            e.printStackTrace();
        }    

    }
});

通过这段代码我得到

E/AndroidRuntime: FATAL EXCEPTION: main
     Process: com.rhcloud.escot.bsr, PID: 1750
     com.google.firebase.database.DatabaseException: Not a direct subclass of GenericTypeIndicator: class com.google.firebase.database.GenericTypeIndicator
         at com.google.android.gms.internal.zzalq.zza(Unknown Source)
         at com.google.firebase.database.DataSnapshot.getValue(Unknown Source)
         at com.rhcloud.escot.bsr.MainActivity$2$1.onDataChange(MainActivity.java:61)
         at com.google.android.gms.internal.zzaih.zza(Unknown Source)
         at com.google.android.gms.internal.zzajh.zzctc(Unknown Source)
         at com.google.android.gms.internal.zzajk$1.run(Unknown Source)
         at android.os.Handler.handleCallback(Handler.java:815)
         at android.os.Handler.dispatchMessage(Handler.java:104)
         at android.os.Looper.loop(Looper.java:194)
         at android.app.ActivityThread.main(ActivityThread.java:5631)
         at java.lang.reflect.Method.invoke(Native Method)
         at java.lang.reflect.Method.invoke(Method.java:372)
         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:959)
         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:754)
07-20 09:07:05.756 757-1407/? W/ActivityManager:   Force finishing activity 1 com.rhcloud.escot.bsr/.MainActivity

有没有我在这里遗漏的部分来阅读路线列表。

java android firebase firebase-realtime-database
3个回答
12
投票

我今天遇到了同样的问题,并通过将此行添加到 ProGuard / R8 配置来解决:

-keepclassmembers class com.google.firebase.database.GenericTypeIndicator { *; }

6
投票

而不是这个:

 GenericTypeIndicator t = new GenericTypeIndicator () {};
 List<Object> routes = (List<Object>) dataSnapshot.getValue(t);

用这个

GenericTypeIndicator<List<Object>> t = new GenericTypeIndicator <List<Object>>() {};
List<Object> routes = dataSnapshot.getValue(t);

0
投票

唯一对我有用的解决方案(截至 2023 年 10 月)是创建一个单独的类型指示器对象并应用略有不同的 proguard 规则。

dto:

@Keep
class MyDto {
    lateinit var id: String
    lateinit var name: String
}

类型指示对象:

@Keep
object MyListTypeIndicator : GenericTypeIndicator<List<@JvmSuppressWildcards ProviderDataDto>>()

用途:

Firebase.database.getReference("YOUR_REFERENCE")
    .get()
    .await()
    .getValue(MyListTypeIndicator)

proguard规则:

-keepattributes Signature
-keep,allowobfuscation,allowshrinking class com.google.firebase.database.GenericTypeIndicator
© www.soinside.com 2019 - 2024. All rights reserved.