SQLite 数据库在 Android Studio 上保存图像

问题描述 投票:0回答:1

我尝试将图像数据存入 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 图像

android sqlite android-studio android-recyclerview
1个回答
0
投票

尚不完全清楚确切的问题是什么,但根据您的描述,存储在数据库中的图像似乎没有显示在 RecyclerView 中。

您可以采取以下几个步骤来排除故障并可能解决问题:

检查图像检索:保存工作记录时,确保图像数据正确存储在数据库中。您可以通过检查数据库条目并确认“logoid”列包含图像数据来验证这一点。

检查图像加载:确保图像数据正确地从数据库中检索并使用 BitmapFactory.decodeByteArray 转换为位图。通过记录 logoBitmap 来验证这一点,看看它是否正确生成。

检查RecyclerView适配器:验证RecyclerView适配器是否正确接收数据并将其绑定到ViewHolder。记录您尝试绑定的数据(例如任务名称、工作时间和徽标位图)以确保它们正确。

检查布局和 ImageView:确保 item_task 布局中的 recyclerLogoView 具有适当的尺寸和属性来显示图像。确保 ImageView 的大小能够容纳加载的图像非常重要。

检查权限:如果您在数据库中存储图像路径或 URI,然后尝试从这些路径加载图像,请确保您的应用具有从文件系统读取图像所需的权限。

检查错误日志:在 Logcat 中查找可能指示图像加载、数据检索或 RecyclerView 绑定问题的任何错误日志。

调试:使用断点并单步执行代码以查看可能出现问题的位置。您可以在每个步骤中检查变量和对象的值以识别任何差异。

简化流程:考虑暂时消除任何复杂性(例如随机图像选择)并专注于显示数据库中的单个已知图像。这可以帮助隔离问题。

使用静态图像进行测试:暂时使用静态图像(可绘制对象)进行测试,而不是从数据库加载图像。这可以帮助确认问题是否与图像加载或数据检索有关。

Glide 或 Picasso:如果以上解决方案都不起作用,请考虑集成 Glide 或 Picasso 等库来加载图像。这些库可以简化在 RecyclerViews 中加载和显示图像的过程。

© www.soinside.com 2019 - 2024. All rights reserved.