Проблема удаления данных из базы данных помещений (Android Studio Java)JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Проблема удаления данных из базы данных помещений (Android Studio Java)

Сообщение Anonymous »

У меня есть 7 классов: класс MainActivity (место, где отображается представление Recycler), класс AddNote, класс UpdateNote, класс NoteDao, класс NoteDatabase (я использую одноэлементную структуру базы данных), класс NoteAdapter и класс Note (модель)
Ниже приведены результаты моих текущих кодов:
1-й: изначально нет Элемент заметки в представлении Recycler, поэтому я нажимаю кнопку «ДОБАВИТЬ», чтобы добавить несколько примечаний, например: 1 и 2.
ПЕРВОЕ ИЗОБРАЖЕНИЕ
2-е: Когда я нажимаю «переработать» bin», для каждого элемента появится кнопка удаления, и я смогу удалить этот элемент.
ВТОРОЕ ИЗОБРАЖЕНИЕ
3-е: Итак, я нажимаю «Удалить», и это кажется ПРАВИЛЬНЫМ. для просмотра Recycler:
ТРЕТЬЕ ИЗОБРАЖЕНИЕ
4-е: Итак, когда я хочу добавить новую заметку, например: 3, 4 и 5, это тоже кажется ПРАВИЛЬНЫМ.
ЧЕТВЕРТОЕ ИЗОБРАЖЕНИЕ
ПЯТОЕ ИЗОБРАЖЕНИЕ
ПЯТОЕ: ПРОБЛЕМА ЗДЕСЬ: Когда я хочу просмотреть каждую заметку, появляются ее детали раньше!
Например: когда я нажимаю на цифру 3, я получаю 1
клик 4, дайте мне 2
клик 5, дайте мне 3... и т. д.
Я смотрю на это целых 2 дня, используя CHATGPT, CLAUDEAI, YOUTUBE, STACKOVERFLOW, GOOGLE, но до сих пор не понял. КАК РЕШИТЬ эту проблему... :( Я ооочень устал.
/>ИМО: мне кажется, что это связано с тем, что я неправильно написал код удаления элемента из базы данных. ПРОБЛЕМА теперь заключается в том, что ЭЛЕМЕНТ успешно удален из RecyclerView, но не удалось удалить из базы данных помещений...
ЭТО МОЙ класс NoteAdapter:

Код: Выделить всё

package com.example.tostudylistv2.RecyclerView;

import android.content.Context;
import android.content.Intent;
import android.os.Handler;
import android.os.Looper;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import com.example.tostudylistv2.Activities.MainActivity;
import com.example.tostudylistv2.Activities.UpdateNote;
import com.example.tostudylistv2.Database.NoteDatabase;
import com.example.tostudylistv2.Note;
import com.example.tostudylistv2.R;

import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class NoteAdapter extends RecyclerView.Adapter{
private Context context;
private List noteList;
private boolean showDoDel = false;

public NoteAdapter(Context context, List noteList) {
this.context = context;
this.noteList = noteList;
}

@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(context).inflate(R.layout.note,parent,false); // to let all UI/ View in the XML layout to be usable
return new ViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
holder.txtNote.setText(noteList.get(position).getTitle());
holder.txtNote.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(context,"WORK",Toast.LENGTH_SHORT).show();
notifyDataSetChanged();
Intent i = new Intent(context, UpdateNote.class);
i.putExtra("position",position);
context.startActivity(i);

}
});

if (showDoDel) {
holder.btnDoDel.setVisibility(View.VISIBLE);
holder.btnDoDel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
delNoteInBackground(noteList.get(position));
}
});
}
else {
holder.btnDoDel.setVisibility(View.GONE);
}

}
public void delNoteInBackground(Note note) {
ExecutorService executorService = Executors.newSingleThreadExecutor();
Handler handler = new Handler(Looper.getMainLooper());

executorService.execute(new Runnable() {
@Override
public void run() {

NoteDatabase.getInstance(context).getNoteDao().deleteNote(note);

handler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(context, "Deleted from the database!", Toast.LENGTH_SHORT).show();
if (!noteList.isEmpty()) {
noteList.remove(note);
notifyDataSetChanged();
}
else {
Toast.makeText(context,"Nothing to delete",Toast.LENGTH_SHORT).show();
}
}
});
}
});
}
@Override
public int getItemCount() {
return noteList.size();
}

public static class ViewHolder extends RecyclerView.ViewHolder { //initialize all the UI element/ view of the item here

private TextView txtNote;
private ImageView btnDoDel;
public ViewHolder(@NonNull View itemView) {
super(itemView);
txtNote = itemView.findViewById(R.id.txtNote);
btnDoDel = itemView.findViewById(R.id.btnDoDel);
}
}

public void setNoteList(List  noteList) {
this.noteList = noteList;
}
public void setShowDoDel(boolean showDoDel) {
this.showDoDel = showDoDel;
}

}
Это мой класс MainActivity:

Код: Выделить всё

package com.example.tostudylistv2.Activities;

import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;

import androidx.activity.EdgeToEdge;
import androidx.activity.result.ActivityResult;
import androidx.activity.result.ActivityResultCallback;
import androidx.activity.result.ActivityResultLauncher;
import androidx.activity.result.contract.ActivityResultContracts;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import com.example.tostudylistv2.Database.NoteDatabase;
import com.example.tostudylistv2.Note;
import com.example.tostudylistv2.RecyclerView.NoteAdapter;
import com.example.tostudylistv2.R;
import com.google.android.material.floatingactionbutton.FloatingActionButton;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class MainActivity extends AppCompatActivity {

private RecyclerView noteRecView;
private List noteList = new ArrayList();
private FloatingActionButton btnAdd, btnDel, btnBack;
private ImageView btnDoDel;
private EditText input;
ActivityResultLauncher activityResultLauncher;
private NoteAdapter adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
EdgeToEdge.enable(this);
setContentView(R.layout.activity_main);
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
return insets;
});

noteRecView = findViewById(R.id.noteRecView);

init();
initListener();

initActivityLauncher();

adapter = new NoteAdapter(this, noteList);
noteRecView.setAdapter(adapter);

LinearLayoutManager lm = new LinearLayoutManager(this);
noteRecView.setLayoutManager(lm);

getNoteInBackground();

}

public void init() {
btnAdd = findViewById(R.id.btnAdd);
btnDel = findViewById(R.id.btnDel);
btnBack = findViewById(R.id.btnBack);
btnDoDel = findViewById(R.id.btnDoDel);
input = findViewById(R.id.input);
}

public void initListener() {
btnAdd.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent i = new Intent(MainActivity.this, AddNote.class);
activityResultLauncher.launch(i);
}
});

btnDel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
adapter.setShowDoDel(true);
adapter.notifyDataSetChanged();  //***important, to refresh the RecView and display the result!!!
btnDel.setVisibility(View.GONE);
btnBack.setVisibility(View.VISIBLE);
}
});
btnBack.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {

btnBack.setVisibility(View.GONE);
adapter.setShowDoDel(false);
adapter.notifyDataSetChanged();
btnDel.setVisibility(View.VISIBLE);

}
});
}

public void addNoteInBackground(Note note) {
ExecutorService executorService = Executors.newSingleThreadExecutor();
Handler handler = new Handler(Looper.getMainLooper());

executorService.execute(new Runnable() {
@Override
public void run() {
NoteDatabase.getInstance(MainActivity.this).getNoteDao().addNote(note);

handler.post(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "Added to the database!", Toast.LENGTH_SHORT).show();
noteList.add(note);
adapter.notifyDataSetChanged();
}
});
}
});
}

public void getNoteInBackground() {
ExecutorService executorService = Executors.newSingleThreadExecutor();
Handler handler = new Handler(Looper.getMainLooper());

executorService.execute(new Runnable() {
@Override
public void run() {
noteList = NoteDatabase.getInstance(MainActivity.this).getNoteDao().getAllNote();

handler.post(new Runnable() {
@Override
public void run() {
adapter.setNoteList(noteList);
adapter.notifyDataSetChanged();

}
});
}
});
}

public void initActivityLauncher() {
activityResultLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(),
new ActivityResultCallback() {
@Override
public void onActivityResult(ActivityResult activityResult) {
int result = activityResult.getResultCode();
Intent data = activityResult.getData();

if (result == RESULT_OK && data != null) {
String newTitle = data.getStringExtra("tempTitle");
if (newTitle != null && !newTitle.isEmpty()) {
Note newNote = new Note(newTitle);
addNoteInBackground(newNote);
}
} else {
Toast.makeText(MainActivity.this, "Operation canceled", Toast.LENGTH_SHORT).show();
}
}
});
}

}
Он должен успешно удалить элемент из базы данных RecyclerView и Room.

Подробнее здесь: https://stackoverflow.com/questions/785 ... tudio-java
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»