Я пытаюсь получить данные из базы данных firebase в реальном времени в режиме ресайклера с помощью FirebaseRecyclerAdapter. Однако каждый раз, когда я пытался, я получал такую ошибку:
E / SQLiteDatabase: Ошибка при вставке android .database.sqlite.SQLiteConstraintException: ограничение UNIQUE не удалось: pending_ops.tag, pending_ops.target_class, pending_ops.target_package, pending_ops.user_id (код 2067) в android .database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId (собственный метод) в android .database.sqlite.SQLiteConnection.executeForLastId2: *. 1028 * .database.sqlite.SQLiteSession.executeForLastInsertedRowId (SQLiteSession. java: 788) в android .database.sqlite.SQLiteStatement.executeInsert (SQLiteStatement. java: 86) в SQL android .database.sqlite.SQL .insertWithOnConflict (SQLiteDatabase. java: 1473) в android .database.sqlite.SQLiteDatabase.insert (SQLiteDatabase. java: 1341) в aose.a (: com.google. android. gms@201817013@20.18.17 ( 020700-311416286): 78) на aort.b (: com.google. android. gms@201817013@20.18.17 (020700-311416286): 11) на aort.a (: com.google. android. gms@201817013@20.18.17 ( 020700-311416286): 100) а t aooq.run (: com.google. android. gms@201817013@20.18.17 (020700-311416286): 11) в rxf.b (: com.google. android. gms@201817013@20.18.17 (020700-311416286): 12) в rxf.run (: com.google. android. gms@201817013@20.18.17 (020700-311416286): 7) в java .util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor. java: 1112) в java .util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor. java: 587) в scz.run (: com.google. android. gms@201817013@20.18.17 (020700-311416286): 0) в java .lang .Thread.run (Thread. java: 818)
Это мой класс модели:
int date;
int value;
public datapoint() {
}
public datapoint(int date, int value) {
this.date = date;
this.value = value;
}
public int getDate() {
return date;
}
public int getValue() {
return value;
}
}
это мой класс адаптера для представления ресайклера:
private List<datapoint> datapointList;
public MyAdapter(List<datapoint> datapointList){
this.datapointList = datapointList;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from ( parent.getContext ()).inflate(R.layout.list_data,parent,false) ;
return new ViewHolder ( view );
}
@Override
public void onBindViewHolder(@NonNull MyAdapter.ViewHolder holder, int position) {
datapoint dp = datapointList.get ( position );
holder.txtdate.setText ( dp.getDate () );
holder.txtvalue.setText ( dp.getValue () );
}
@Override
public int getItemCount() {
return datapointList.size ();
}
public class ViewHolder extends RecyclerView.ViewHolder {
private TextView txtdate,txtvalue;
public ViewHolder(@NonNull View itemView) {
super ( itemView );
txtdate = (TextView) itemView.findViewById ( R.id.datetxt );
txtvalue = (TextView) itemView.findViewById ( R.id.valuetxt );
}
}
}
и вот как я получаю данные из firebase:
private List<datapoint> datapointList;
private RecyclerView rv;
private MyAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate ( savedInstanceState );
setContentView ( R.layout.activity_main2 );
rv = (RecyclerView)findViewById ( R.id.myRecyclerview);
rv.setHasFixedSize ( true );
rv.setLayoutManager ( new LinearLayoutManager ( this ) );
datapointList= new ArrayList<> ();
final DatabaseReference nm = FirebaseDatabase.getInstance ().getReference().child ("fieldX").child ( "temperature" );
nm.addListenerForSingleValueEvent ( new ValueEventListener () {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
if (dataSnapshot.exists ()){
for(DataSnapshot npsnapshot : dataSnapshot.getChildren ()){
datapoint d = npsnapshot.getValue (datapoint.class);
datapointList.add ( d );
}
adapter = new MyAdapter ( datapointList );
rv.setAdapter ( adapter );
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
} );
}
}
Я новичок в этом, почему я получил ошибку SQL? Я даже не пользовался. Что-то не так с моим кодом?