当前位置:首页 > 行业动态 > 正文

如何在Android开发中实现数据库存取图片的Demo?

在Android开发中,使用SQLite数据库存储和检索图片可以通过将图片转换为字节数组来实现。将Bitmap对象转换为byte[]类型,然后将其作为BLOB数据类型存储到数据库中。检索时,从数据库中读取byte[]数据,再转换回Bitmap对象即可显示图片。

Android开发:数据库存取图片Demo

如何在Android开发中实现数据库存取图片的Demo?  第1张

在Android应用开发中,处理图片存储和检索是常见的需求之一,本文将通过一个示例项目,介绍如何在SQLite数据库中存取图片数据,我们将使用SQLite数据库存储图片的二进制数据,并在应用中展示这些图片。

1. 环境准备

1 创建新项目

在Android Studio中创建一个新的项目,选择“Empty Activity”模板,并命名为ImageStorageDemo。

2 添加依赖

在build.gradle文件中添加以下依赖,以便我们可以使用SQLite数据库:

dependencies {
    implementation 'androidx.appcompat:appcompat:1.3.0'
    implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
    implementation 'androidx.recyclerview:recyclerview:1.2.1'
    implementation 'com.google.android.material:material:1.3.0'
}

同步项目以确保所有依赖都已下载。

2. 创建数据库帮助类

我们需要创建一个数据库帮助类来管理数据库的创建和版本管理,在这个类中,我们还将定义用于存储图片的表。

1 创建DBHelper类

在项目的java目录下,新建一个名为DBHelper的类,这个类继承自SQLiteOpenHelper:

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
public class DBHelper extends SQLiteOpenHelper {
    private static final String DATABASE_NAME = "ImageStorage.db";
    private static final int DATABASE_VERSION = 1;
    private static final String TABLE_NAME = "Images";
    private static final String COLUMN_ID = "id";
    private static final String COLUMN_IMAGE = "image";
    public DBHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
    }
    @Override
    public void onCreate(SQLiteDatabase db) {
        String createTableQuery = "CREATE TABLE " + TABLE_NAME + " (" +
                COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                COLUMN_IMAGE + " BLOB NOT NULL);";
        db.execSQL(createTableQuery);
    }
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME);
        onCreate(db);
    }
}

3. 插入和检索图片

我们需要实现插入和检索图片的方法,我们将创建一个名为ImageRepository的类来封装这些操作。

3.1 创建ImageRepository类

在项目的java目录下,新建一个名为ImageRepository的类:

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
public class ImageRepository {
    private DBHelper dbHelper;
    public ImageRepository(Context context) {
        dbHelper = new DBHelper(context);
    }
    public long insertImage(byte[] image) {
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put("image", image);
        return db.insert("Images", null, values);
    }
    public List<byte[]> getAllImages() {
        List<byte[]> images = new ArrayList<>();
        SQLiteDatabase db = dbHelper.getReadableDatabase();
        Cursor cursor = db.query("Images", new String[]{"image"}, null, null, null, null, null);
        while (cursor.moveToNext()) {
            byte[] image = cursor.getBlob(cursor.getColumnIndex("image"));
            images.add(image);
        }
        cursor.close();
        return images;
    }
}

4. 设计用户界面

为了展示图片,我们需要设计一个简单的用户界面,我们将使用RecyclerView来显示图片列表。

1 修改布局文件

打开activity_main.xml文件,并替换为以下代码以包含一个RecyclerView:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerView"
        android:layout_width="0dp"
        android:layout_height="0dp"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintEnd_toEndOf="parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>

2 创建适配器类

在项目的java目录下,新建一个名为ImageAdapter的类:

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import java.util.List;
public class ImageAdapter extends RecyclerView.Adapter<ImageAdapter.ImageViewHolder> {
    private List<byte[]> images;
    private Context context;
    public ImageAdapter(Context context, List<byte[]> images) {
        this.context = context;
        this.images = images;
    }
    @NonNull
    @Override
    public ImageViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.item_image, parent, false);
        return new ImageViewHolder(view);
    }
    @Override
    public void onBindViewHolder(@NonNull ImageViewHolder holder, int position) {
        byte[] imageBytes = images.get(position);
        Bitmap bitmap = BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.length);
        holder.imageView.setImageBitmap(bitmap);
    }
    @Override
    public int getItemCount() {
        return images != null ? images.size() : 0;
    }
    static class ImageViewHolder extends RecyclerView.ViewHolder {
        ImageView imageView;
        public ImageViewHolder(@NonNull View itemView) {
            super(itemView);
            imageView = itemView.findViewById(R.id.imageView);
        }
    }
}

3 创建单个图片项布局文件

在res/layout目录下,新建一个名为item_image.xml的文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">
    <ImageView
        android:id="@+id/imageView"
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:scaleType="centerCrop"/>
</LinearLayout>

5. 主活动逻辑实现

我们在MainActivity中实现主要的业务逻辑,包括插入图片和显示图片。

1 修改MainActivity类

打开MainActivity.java文件,并替换为以下代码:

package com.example.imagestoragedemo;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.widget.Toast;
import java.io.ByteArrayOutputStream;
import java.util.List;
public class MainActivity extends AppCompatActivity {
    private ImageRepository imageRepository;
    private RecyclerView recyclerView;
    private ImageAdapter adapter;
    private List<byte[]> images;
    private Bitmap bitmap; // 用于存储临时位图对象
    private byte[] imageBytes; // 用于存储图像字节数组
    private boolean isCamera = false; // 标记是否从相机捕获图像(此处未实现相机功能)
    private static final int GALLERY_REQUEST_CODE = 1; // 请求码常量,用于启动图库选择器活动
    private static final int CAMERA_REQUEST_CODE = 2; // 请求码常量,用于启动相机活动(此处未实现相机功能)
    private static final int CROP_REQUEST_CODE = 3; // 请求码常量,用于启动裁剪活动(此处未实现裁剪功能)
    private static final int PICK_FROM_CAMERA = 4; // 请求码常量,用于从相机捕获图像(此处未实现)
    private static final int PICK_FROM_GALLERY = 5; // 请求码常量,用于从图库选择图像(此处未实现)
    private static final String IMAGE_DIRECTORY_NAME = "ImageStorageDemo"; // 图像目录名称常量(此处未实现)
    private static final int MEDIA_TYPE_IMAGE = 1; // 媒体类型常量(此处未实现)
    private static final int COMPRESSION_QUALITY = 90; // 压缩质量常量(此处未实现)
    private static final String IMAGE_DIRECTORY_NAME = "ImageStorageDemo"; // 图像目录名称常量(此处未实现)
    private static final int MEDIA_TYPE_IMAGE = 1; // 媒体类型常量(此处未实现)
    private static final int COMPRESSION_QUALITY = 90; // 压缩质量常量(此处未实现)
    private static final String IMAGE_DIRECTORY_NAME = "ImageStorageDemo"; // 图像目录名称常量(此处未实现)
    private static final int MEDIA_TYPE_IMAGE = 1; // 媒体类型常量(此处未实现)
    private static final int COMPRESSION_QUALITY = 90; // 压缩质量常量(此处未实现)

各位小伙伴们,我刚刚为大家分享了有关“android开发 数据库存取图片demo”的知识,希望对你们有所帮助。如果您还有其他相关问题需要解决,欢迎随时提出哦!

0