我尝试将图像数据存入 sqlite 数据库。在我想获取数据库中的数据并使用回收器视图之后。但其他数据成功图像数据未进入回收站视图
这是我的数据库类 `public class DBOpenHelper 扩展 SQLiteOpenHelper {
public static final String DATABASE_NAME = "workifyDatabase";
public static final int DATABASE_VERSION = 1;
/* Constructor for the DBOpenHelper class, private to force use of singleton */
private DBOpenHelper(Context context) {
super(context,DATABASE_NAME,null,DATABASE_VERSION);
}
/* Singleton approach (i.e. only 1 instance of DBOpenHelper exists)*/
private static volatile DBOpenHelper instance;
public static DBOpenHelper getInstance(Context context) {
if (instance==null) {
instance = new DBOpenHelper(context);
}
return instance;
}
/* If the database does not exist, then this method will be called */
/* ideal place to create the table(s) */
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE IF NOT EXISTS workifydatabase(id INTEGER PRIMARY KEY,workname VARCHAR,logoid BLOB,year VARCHAR,workinghours INTEGER) ");
}
/* If the database version is increased, then this method will be invoked */
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
/* Method to insert a row, using the convenience insert method */
/* this generates the underlying SQL and furthermore returns the id of the inserted row or -1 if the row was not inserted */
public long saveWorkRecord(String workname,byte[] logoid, String year,int workinghours) {
ContentValues cv = new ContentValues();
cv.put("workname",workname);
cv.put("logoid",logoid);
cv.put("year",year);
cv.put("workinghours",workinghours);
return this.getWritableDatabase().insert("workifydatabase",null,cv);
}
/* Example of retrieving data (might want to adapt this to return a TaskArrayList rather than a Cursor) */
public Cursor getAllDataAsCursor() {
return this.getWritableDatabase().query("workifydatabase",null /* all columns */,null /* all rows*/,null /* no selection args */, null,null,null);
}
}`
这是我的 addind 数据类 `editTextTaskName = findViewById(R.id.editTextTaskName); int selectedLogoId = LogoView.getId(); byte[] logoIdBytes = ByteBuffer.allocate(4).putInt(selectedLogoId).array();
Button saveButton = findViewById(R.id.saveButton);
saveButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String workName = editTextTaskName.getText().toString();
int workingHours = 0;
Date date = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());
String formattedDate = dateFormat.format(date);
Cursor csr = db.getAllDataAsCursor();
boolean isDuplicate = false;
while (csr.moveToNext()) {
String existingWorkName = csr.getString(csr.getColumnIndex("workname"));
if (existingWorkName.equals(workName)) {
isDuplicate = true;
break;
}
}
if (!isDuplicate) {
// Aynı isimde ödev yoksa kaydet
db.saveWorkRecord(workName, logoIdBytes, formattedDate, workingHours);
csr = db.getAllDataAsCursor();
DatabaseUtils.dumpCursor(csr);
finish();
} else {
Toast.makeText(CreateScreen.this, "There is already a task with this name!", Toast.LENGTH_SHORT).show();
}
}
});`
这是使用类回收器视图 `私有无效 getData(){
try {
DBOpenHelper dbHelper = DBOpenHelper.getInstance(getContext());
//ArrayList<Task> taskList = new ArrayList<>();
Cursor cursor = dbHelper.getAllDataAsCursor();
int nameIx = cursor.getColumnIndex("workname");
int logoIdIx = cursor.getColumnIndex("logoid");
int yearIx = cursor.getColumnIndex("year");
int workingHoursIx = cursor.getColumnIndex("workinghours");
while (cursor.moveToNext()) {
String workName = cursor.getString(nameIx);
byte[] logoId = cursor.getBlob(logoIdIx);
Bitmap logoBitmap = BitmapFactory.decodeByteArray(logoId, 0, logoId.length);
String formattedDate = cursor.getString(yearIx);
int workingHours = cursor.getInt(workingHoursIx);
Task task = new Task(workName, logoBitmap, workingHours, formattedDate);
TaskArrayList.add(task);
}
taskAdapter.notifyDataSetChanged();
}catch (Exception e){
e.printStackTrace();
}
}`
最后这是我的回收器视图适配器类
`公共类 TaskAdapter 扩展了 RecyclerView.Adapter
ArrayList<Task> TaskArrayList;
int enqueueNumber;
public TaskAdapter(ArrayList<Task> TaskArrayList) {
this.TaskArrayList = TaskArrayList;
}
@NonNull
@Override
public TaskViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_task, parent, false);
return new TaskViewHolder(itemView);
}
@Override
public void onBindViewHolder(@NonNull TaskViewHolder holder, int position) {
holder.titleText.setText(TaskArrayList.get(position).getTaskName());
holder.infoText.setText("Total Working Hours: " + TaskArrayList.get(position).getWorkingHours());
holder.recyclerLogoView.setImageBitmap(TaskArrayList.get(position).getLogoBitmap());
}
@Override
public int getItemCount() {
return TaskArrayList.size();
}
class TaskViewHolder extends RecyclerView.ViewHolder {
TextView titleText;
TextView infoText;
ImageView imageViewTasks;
ImageView imageViewTasks2;
ImageView imageViewTasks8;
ImageView recyclerLogoView;
public TaskViewHolder(@NonNull View itemView) {
super(itemView);
titleText = itemView.findViewById(R.id.titleText);
infoText = itemView.findViewById(R.id.infoText);
imageViewTasks = itemView.findViewById(R.id.imageViewTasks);
imageViewTasks2 = itemView.findViewById(R.id.imageViewTasks2);
imageViewTasks8 = itemView.findViewById(R.id.imageViewTasks8);
recyclerLogoView = itemView.findViewById(R.id.recyclerLogoView);
Random random = new Random();
int randomNumber = random.nextInt(13)+1;
enqueueNumber = 15%randomNumber;
if (enqueueNumber == 0){
imageViewTasks8.setImageResource(R.drawable.orange);
}else if(enqueueNumber == 2){
imageViewTasks8.setImageResource(R.drawable.yellow);
}else if(enqueueNumber == 3){
imageViewTasks8.setImageResource(R.drawable.gray);
} else if (enqueueNumber == 1) {
imageViewTasks8.setImageResource(R.drawable.green);
}else if(enqueueNumber == 6){
imageViewTasks8.setImageResource(R.drawable.blue);
}else if(enqueueNumber == 5){
imageViewTasks8.setImageResource(R.drawable.pink);
}else if(enqueueNumber == 4){
imageViewTasks8.setImageResource(R.drawable.purple);
}else if(enqueueNumber == 7){
imageViewTasks8.setImageResource(R.drawable.red);
}
}
}
}` 我想在 recyclerview 上制作可见的 recyclerviewlogo 图像
尚不完全清楚确切的问题是什么,但根据您的描述,存储在数据库中的图像似乎没有显示在 RecyclerView 中。
您可以采取以下几个步骤来排除故障并可能解决问题:
检查图像检索:保存工作记录时,确保图像数据正确存储在数据库中。您可以通过检查数据库条目并确认“logoid”列包含图像数据来验证这一点。
检查图像加载:确保图像数据正确地从数据库中检索并使用 BitmapFactory.decodeByteArray 转换为位图。通过记录 logoBitmap 来验证这一点,看看它是否正确生成。
检查RecyclerView适配器:验证RecyclerView适配器是否正确接收数据并将其绑定到ViewHolder。记录您尝试绑定的数据(例如任务名称、工作时间和徽标位图)以确保它们正确。
检查布局和 ImageView:确保 item_task 布局中的 recyclerLogoView 具有适当的尺寸和属性来显示图像。确保 ImageView 的大小能够容纳加载的图像非常重要。
检查权限:如果您在数据库中存储图像路径或 URI,然后尝试从这些路径加载图像,请确保您的应用具有从文件系统读取图像所需的权限。
检查错误日志:在 Logcat 中查找可能指示图像加载、数据检索或 RecyclerView 绑定问题的任何错误日志。
调试:使用断点并单步执行代码以查看可能出现问题的位置。您可以在每个步骤中检查变量和对象的值以识别任何差异。
简化流程:考虑暂时消除任何复杂性(例如随机图像选择)并专注于显示数据库中的单个已知图像。这可以帮助隔离问题。
使用静态图像进行测试:暂时使用静态图像(可绘制对象)进行测试,而不是从数据库加载图像。这可以帮助确认问题是否与图像加载或数据检索有关。
Glide 或 Picasso:如果以上解决方案都不起作用,请考虑集成 Glide 或 Picasso 等库来加载图像。这些库可以简化在 RecyclerViews 中加载和显示图像的过程。