从 Firebase 检索第二个项目时出错
Posted
技术标签:
【中文标题】从 Firebase 检索第二个项目时出错【英文标题】:Got an error when I retrieve second item from Firebaase 【发布时间】:2021-05-05 19:08:02 【问题描述】:这是我的第一个 android 应用程序,我很兴奋,但我在最后一个函数中遇到了错误。可以检索第一个数据,但是当我从 firebase 数据库检索第二个数据时出现错误 "java.lang.IndexOutOfBoundsException: Index: 1, Size 1 at java.util.ArrrayList.get()"
这是我的程序
//start here
DatabaseReference myRef = FirebaseDatabase.getInstance().getReference().child("Users")
.child(FirebaseAuth.getInstance().getCurrentUser().getUid()).child("Wishlist");
myRef.addListenerForSingleValueEvent(new ValueEventListener()
@Override
public void onDataChange(@NonNull DataSnapshot snapshot)
List<String> wishlist_item = new ArrayList<String>();
for (DataSnapshot postSnapshot: snapshot.getChildren())
String data = postSnapshot.getValue(String.class);
wishlist_item.add(data);
//list 1
L1.setOnClickListener(new View.OnClickListener()
String a = wishlist_item.get(0);
@Override
public void onClick(View view)
if(a.isEmpty())
Toast.makeText(wish_list.this, "Empty Field", Toast.LENGTH_SHORT).show();
else
Intent launchWish = new Intent(wish_list.this,web_view2.class);
launchWish.putExtra("k",a);
startActivity(launchWish);
);
//list 2
L2.setOnClickListener(new View.OnClickListener()
String b = wishlist_item.get(1);
@Override
public void onClick(View view)
if(b.isEmpty())
Toast.makeText(wish_list.this, "Empty Field", Toast.LENGTH_SHORT).show();
else
Intent launchWish = new Intent(wish_list.this,web_view2.class);
launchWish.putExtra("k",b);
startActivity(launchWish);
);
//the end for 5 lists
@Override
public void onCancelled(@NonNull DatabaseError error)
);
我只想从我的 Firebase 中检索 5 个数据。你可以在这里查看我的 firebase 表
You can see my firebase table here
我从昨天开始一直在解决这个问题,但没有得到任何答案。非常感谢您的帮助。
【问题讨论】:
如果您尝试在“onDataChange()”方法中记录data
对象,是否会在 logcat 中打印出一些内容?
不,先生@AlexMamo
那么你的 onDataChange 是否被触发了?除此之外,停止忽略错误。使用Log.d(TAG, databaseError.getMessage());
。您是否在 logcat 中打印了一些内容?
我用 textview 打印出 wishlist_item,它给了我来自 firebase 数据库的所有数据,但是当我尝试像这样 .get(1) 得到错误时,@AlexMamo
点击L1或L2时会出现这种情况吗?
【参考方案1】:
正如您在问题中提到的,您收到以下错误:
“java.lang.IndexOutOfBoundsException:索引:1,java.util.ArrayList.get() 的大小为 1”
因为您试图从“ArrayList”中不存在的位置获取元素。正如我在以下参考资料中看到的:
Firebase-root -> Users -> "GRUK ... cL03" -> Wishlist
那里有两个项目,但是,错误消息非常明确地说只有一个。最有可能的是,第二个用户“T9az ... I4v2”的愿望清单,我认为它是真正的登录用户,在愿望清单中包含一个项目,因此出现了错误。所以为了解决这个问题,在使用它们之前,一定要确保你可以在相应的索引处找到元素,而不是盲目地假设一个元素总是存在的。
【讨论】:
啊,是的,你是对的,但是当我添加更多按钮然后数据库中的数据量时,应用程序出错了。我该如何处理?总是会有 5 个按钮,但数据库中不会有 5 个项目,它会是空的或 1 或 2 或 3。那么我该如何处理呢? @Alex Mamo 很简单,在访问其中一个元素之前检查数组的大小。比如你想从第二个位置(索引1)获取一个元素,确保数组的大小是wishlist_item.size() >= 2
,对吧?
我可以把先生放在哪里我不能把它放在 L1 onClick @Alex Mamo
每次尝试访问数组中的元素时都需要设置该条件。您始终需要确保特定索引存在。
知道了,先生,非常感谢您的帮助。你介意告诉我我怎样才能只接受 5 个项目到 firebase DatabaseReference myRef = FirebaseDatabase.getInstance() .getReference().child("Users") .child(FirebaseAuth.getInstance().getCurrentUser().getUid()) .child("愿望清单"); myRef.push().setValue("librarything.com/isbn" + passURL).addOnCompleteListener(new OnCompleteListener以上是关于从 Firebase 检索第二个项目时出错的主要内容,如果未能解决你的问题,请参考以下文章