Android开发:数据库存取图片Demo
在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”的知识,希望对你们有所帮助。如果您还有其他相关问题需要解决,欢迎随时提出哦!