如何在 Firebase 实时数据库中存储浮点列表?
Posted
技术标签:
【中文标题】如何在 Firebase 实时数据库中存储浮点列表?【英文标题】:How to store a list of floats in Firebase Realtime Database? 【发布时间】:2021-09-27 22:27:39 【问题描述】:我有一个浮点列表,可以捕获用户触摸的轨迹,并且必须将该列表存储在 Firebase 实时数据库中。变量的声明和存储方式如下:
public boolean dispatchTouchEvent(MotionEvent event)
TouchData touchData = new TouchData();
int index = event.getActionIndex();
int pointerId = event.getPointerId(index);
//Lists which need to be stored
List<Float> xTraj = new ArrayList<Float>();
List<Float> yTraj = new ArrayList<Float>();
final int X = (int) event.getRawX();
final int Y = (int) event.getRawY();
xTraj.add(event.getX());
yTraj.add(event.getY());
switch (event.getAction() & MotionEvent.ACTION_MASK)
case MotionEvent.ACTION_DOWN:
xTraj.add(event.getX());
yTraj.add(event.getY());
if(mVelocityTracker == null)
// Retrieve a new VelocityTracker object to watch the velocity of a motion.
mVelocityTracker = VelocityTracker.obtain();
else
// Reset the velocity tracker back to its initial state.
mVelocityTracker.clear();
// Add a user's movement to the tracker.
mVelocityTracker.addMovement(event);
break;
case MotionEvent.ACTION_UP:
float centreX = button.getX() + button.getWidth() / 2;
float centreY = button.getY() + button.getHeight() / 2;
long eventDuration = event.getEventTime() - event.getDownTime();
DatabaseReference newRef = FirebaseDatabase.getInstance("https://pragya-datacollector.firebaseio.com").getReference();
touchData.setUniqueID(currentUserID);
touchData.setTaskName(TASK_NAME);
touchData.setTouchDuration(eventDuration);
touchData.setxTrajectory(xTraj);
touchData.setyTrajectory(yTraj);
touchData.setxVelocity(xVelocity);
touchData.setyVelocity(yVelocity);
touchData.setTargetX(centreX);
touchData.setTargetY(centreY);
newRef.addListenerForSingleValueEvent(new ValueEventListener()
@Override
public void onDataChange(@NonNull DataSnapshot snapshot)
databaseReference.push().setValue(touchData);
@Override
public void onCancelled(@NonNull DatabaseError error)
);
break;
case MotionEvent.ACTION_MOVE:
mVelocityTracker.addMovement(event);
mVelocityTracker.computeCurrentVelocity(1);
xVelocity = mVelocityTracker.getXVelocity();
yVelocity = mVelocityTracker.getYVelocity();
xTraj.add(event.getX());
yTraj.add(event.getY());
break;
case MotionEvent.ACTION_CANCEL:
mVelocityTracker.recycle();
break;
return super.dispatchTouchEvent(event);
这是TouchData
类:
public class TouchData
private String taskName;
private long touchDuration;
private List<Float> xTrajectory;
private List<Float> yTrajectory;
private float xVelocity;
private float yVelocity;
private String uniqueID;
private float targetX;
private float targetY;
public TouchData()
public String getTaskName()
return taskName;
public void setTaskName(String taskName)
this.taskName = taskName;
public List<Float> getxTrajectory()
return xTrajectory;
public void setxTrajectory(List<Float> touchTrajectory)
this.xTrajectory = xTrajectory;
public List<Float> getyTrajectory()
return yTrajectory;
public void setyTrajectory(List<Float> touchTrajectory)
this.yTrajectory = yTrajectory;
public long getTouchDuration()
return touchDuration;
public void setTouchDuration(long touchDuration)
this.touchDuration = touchDuration;
public float getxVelocity()
return xVelocity;
public void setxVelocity(float xVelocity)
this.xVelocity = xVelocity;
public float getyVelocity()
return yVelocity;
public void setyVelocity(float yVelocity)
this.yVelocity = yVelocity;
public String getUniqueID()
return uniqueID;
public void setUniqueID(String uniqueID)
this.uniqueID = uniqueID;
public float getTargetX()
return targetX;
public void setTargetX(float targetX)
this.targetX = targetX;
public float getTargetY()
return targetY;
public void setTargetY(float targetY)
this.targetY = targetY;
在这个实现中发生的事情是除了列表之外的所有数据都被存储了。不允许在firebase上存储列表吗?如果没有,我该如何继续这样做?
【问题讨论】:
首先,停止忽略错误。使用Log.d(TAG, error.getMessage());
。您是否在 logcat 中打印了一些内容?
我正在尝试这样做,但我看到了消息Tag Manager is not found and thus will not be used
试试Log.d("YOUR_TAG", error.getMessage());
。
Firebase 的 onCancelled
方法中没有打印任何内容,这就是您希望我将日志消息放在哪里?
将 Float 类型的对象列表添加到 Firebase 实时数据库绝对是可能的。尝试将 List<Float> xTrajectory
重命名为 List<Float> trajectoryX
并将 setter 重命名为 public void setTrajectoryX(List<Float> trajectoryX) this.trajectoryX = trajectoryX;
并告诉我它是否有效。
【参考方案1】:
当您使用“TouchData”类型的对象将数据写入 Firebase 实时数据库时,您的类中的字段应根据 JavaBeans 标准命名。
这意味着当使用下面的setter时:
public void setxTrajectory(List<Float> touchTrajectory)
this.xTrajectory = xTrajectory;
Firebase 正在管理一个名为 XTrajectory
和 not xTrajectory
的属性。看到大写的 X 了吗?所以为了解决这个问题,给属性命名更有意义:
private List<Float> trajectoryX;
使用相应的setter:
public void setTrajectoryX(List<Float> trajectoryX)
this.trajectoryX = trajectoryX;
和吸气剂:
public List<Float> getTrajectoryX()
return trajectoryX;
为了能够使用所有其他字段,您还应该相应地更改它们的名称。
【讨论】:
以上是关于如何在 Firebase 实时数据库中存储浮点列表?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Firebase 实时数据库创建特定用户所有已保存帖子的列表?
如何在flutter中从firebase实时数据库中获取数据?
如何从 Firebase 实时数据库中获取数据到 Flutter 中的列表中?
如何使用 Firebase 实时数据库在不知道 Android 索引的情况下更新 ArrayList 中的元素?