java - 错误:com.google.firebase.database.DatabaseException:无法将 java.util.ArrayList 类型的值转换为字符串
问题描述
我正在尝试在我的应用程序中查看几张图片,并且图片链接保存在 Firebase 实时数据库中。我将这些链接作为 .JSON 上传,并没有手动将它们添加到实时数据库中。当尝试在我的应用程序中检索这些图像时,它在单击按钮启动图像几秒钟后崩溃(“ZamCatalog 已停止”)。在日志中,我收到以下错误。不知道哪里出错了,请帮忙。
E/AndroidRuntime:致命异常:主进程:com.example.android.zamcatalog,PID:13529 com.google.firebase.database.DatabaseException:无法将 java.util.ArrayList 类型的值转换为 com.google.android 的字符串.gms.internal.zzelw.zzb(Unknown Source:93) at com.google.android.gms.internal.zzelw.zza(Unknown Source:0) at com.google.firebase.database.DataSnapshot.getValue(Unknown Source: 10) com.example.android.zamcatalog.gameActivity$1.onDataChange(gameActivity.java:43) at com.google.android.gms.internal.zzegf.zza(Unknown Source:13) at com.google.android.gms .internal.zzeia.zzbyc(未知来源:2)在 com.google.android.gms.internal。zzeig.run(Unknown Source:71) at android.os.Handler.handleCallback(Handler.java:789) at android.os.Handler.dispatchMessage(Handler.java:98) at android.os.Looper.loop(Looper. java:164) at android.app.ActivityThread.main(ActivityThread.java:6944) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote. java:327) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374) 应用程序终止。在 com.android.internal.os.Zygote$MethodAndArgsCaller 的 java.lang.reflect.Method.invoke(Native Method) 的 android.app.ActivityThread.main(ActivityThread.java:6944) 的循环(Looper.java:164)。在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374) 处运行 (Zygote.java:327) 应用程序终止。在 com.android.internal.os.Zygote$MethodAndArgsCaller 的 java.lang.reflect.Method.invoke(Native Method) 的 android.app.ActivityThread.main(ActivityThread.java:6944) 的循环(Looper.java:164)。在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374) 处运行 (Zygote.java:327) 应用程序终止。
下面是保存在数据库中的图像的快照
检索图像的游戏活动代码
public class gameActivity extends AppCompatActivity {
ViewPager viewPager;
ViewPagerAdapter adapter;
private FirebaseDatabase firebaseDatabase=FirebaseDatabase.getInstance();
private DatabaseReference reference=firebaseDatabase.getReference();
//private DatabaseReference childreference=reference.child("images");
private DatabaseReference gameReference=reference.child("game");
private ArrayList<String> images = new ArrayList<String>();
@Override
protected void onStart() {
super.onStart();
gameReference.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
String images = dataSnapshot.getValue(String.class);
}
@Override
public void onCancelled(DatabaseError databaseError) {
// Log.w(TAG, "loadImage:onCancelled", databaseError.toException());
}
});
}
viewPager = (ViewPager)findViewById(R.id.viewpager);
adapter = new ViewPagerAdapter(gameActivity.this,images);
viewPager.setAdapter(adapter);
}
ViewPager 适配器
public class ViewPagerAdapter extends PagerAdapter {
Activity activity;
ArrayList<String> images;
LayoutInflater inflater;
public ViewPagerAdapter(Activity activity, ArrayList<String> images) {
this.activity = activity;
this.images = images;
}
@Override
public int getCount() {
return images.size();
}
@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
return view == object;
}
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
inflater = (LayoutInflater) activity.getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View itemview = inflater.inflate(R.layout.viewpager_item, container, false);
ImageView image;
image = (ImageView) itemview.findViewById(R.id.imageView);
DisplayMetrics dis = new DisplayMetrics();
activity.getWindowManager().getDefaultDisplay().getMetrics(dis);
int height = dis.heightPixels;
int width = dis.widthPixels;
image.setMinimumHeight(height);
image.setMinimumWidth(width);
try {
Glide.with(activity.getApplicationContext())
//.using(new FirebaseImageLoader())
.load(images.get(position)) //This is were you put the storageReference
.into(image);
} catch (Exception ex) {
}
//notifyDataSetChanged();
container.addView(itemview);
return itemview;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
((ViewPager) container).removeView((View) object);
}
}
解决方案
要正确获取所有这些 url,请使用以下代码行:
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference gameRef = rootRef.child("game");
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot ds : dataSnapshot.getChildren()) {
String url = ds.getValue(String.class);
Log.d("TAG", url);
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
Log.d(TAG, databaseError.getMessage());
}
};
gameRef.addListenerForSingleValueEvent(valueEventListener);
您的 logcat 中的输出将是所有这些 url。
推荐阅读
- c++ - C++ 初学者,尝试打印值时访问冲突
- javascript - NestJS 和 Mongoose 使用 Mongoose-Sequence
- angular - allowedCommonJsDependencies 在 angular.json 中未被识别为有效属性
- javascript - 在同一页面的“全局”级别从命名空间访问 JavaScript 变量
- python - 使用 Python 提交文件更改
- kubernetes - Kubernetes 指标“/metrics/resource/v1alpha1”和“/metrics/cadvisor”端点之间的区别
- sqlite - 即使删除之前的项目,SQLite 对象是否保留其 ID?
- python - BeautifulSoup 不会正确删除包含“类似文本”标签的标签
- powershell - 如何使用 powershell 脚本从合流页面下载附件?
- javascript - 增加和缩小输入