android怎样用room数据库保存app调用系统相机拍到的照片,并用recyclerview展示出来
时间: 2023-12-17 07:05:24 浏览: 160
首先,需要在你的项目中添加 Room Persistence Library 的依赖:
```
implementation "androidx.room:room-runtime:x.x.x"
annotationProcessor "androidx.room:room-compiler:x.x.x"
```
其中,`x.x.x` 代表版本号。
然后,定义一个实体类来表示照片,并使用 `@Entity` 注解标记它。例如:
```
@Entity(tableName = "photos")
data class Photo(
@PrimaryKey(autoGenerate = true)
val id: Int = 0,
val path: String,
val timestamp: Long
)
```
这个实体类有三个属性:`id`、`path` 和 `timestamp`。其中,`id` 是主键,`path` 存储照片的路径,`timestamp` 存储拍摄时间。
接着,定义一个 DAO 接口来操作照片数据。例如:
```
@Dao
interface PhotoDao {
@Query("SELECT * FROM photos")
fun getAll(): List<Photo>
@Insert
fun insert(photo: Photo)
}
```
这个 DAO 接口定义了两个方法:`getAll()` 返回所有照片,`insert(photo: Photo)` 插入一张新照片。
然后,在你的 AppDatabase 类中添加一个抽象方法,返回 `PhotoDao` 对象。例如:
```
@Database(entities = [Photo::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
abstract fun photoDao(): PhotoDao
}
```
现在,你可以在你的 Activity 中调用系统相机来拍照,并把照片保存到数据库中。例如:
```
val photoFile = createImageFile()
val photoUri = FileProvider.getUriForFile(this, "com.example.myapp.fileprovider", photoFile)
val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
takePictureIntent.putExtra(MediaStore.EXTRA_OUTPUT, photoUri)
startActivityForResult(takePictureIntent, REQUEST_IMAGE_CAPTURE)
```
其中,`createImageFile()` 方法用于创建一个临时文件来保存拍摄的照片,`FileProvider.getUriForFile()` 方法用于获取文件的 URI,`MediaStore.ACTION_IMAGE_CAPTURE` 是拍照的 Intent,`MediaStore.EXTRA_OUTPUT` 参数指定拍摄的照片保存的位置,`startActivityForResult()` 方法用于启动拍照 Intent。
在 `onActivityResult()` 方法中,你可以把照片的路径和拍摄时间保存到数据库中。例如:
```
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
if (requestCode == REQUEST_IMAGE_CAPTURE && resultCode == RESULT_OK) {
val photo = Photo(path = currentPhotoPath, timestamp = System.currentTimeMillis())
val db = Room.databaseBuilder(applicationContext, AppDatabase::class.java, "myapp.db").build()
db.photoDao().insert(photo)
db.close()
}
}
```
其中,`currentPhotoPath` 是拍摄的照片保存的路径,`System.currentTimeMillis()` 返回当前时间戳,用于记录拍摄时间。
最后,你可以使用 RecyclerView 来展示保存的照片。首先,定义一个 ViewHolder 类来表示每个照片的布局。例如:
```
class PhotoViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
private val imageView: ImageView = itemView.findViewById(R.id.imageView)
private val timestampView: TextView = itemView.findViewById(R.id.timestampView)
fun bind(photo: Photo) {
imageView.setImageURI(Uri.parse(photo.path))
timestampView.text = SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(Date(photo.timestamp))
}
}
```
然后,在 Activity 中创建 RecyclerView,并使用 Adapter 来显示照片。例如:
```
val db = Room.databaseBuilder(applicationContext, AppDatabase::class.java, "myapp.db").build()
val photos = db.photoDao().getAll()
db.close()
val recyclerView: RecyclerView = findViewById(R.id.recyclerView)
recyclerView.layoutManager = LinearLayoutManager(this)
recyclerView.adapter = object : RecyclerView.Adapter<PhotoViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PhotoViewHolder {
val itemView = LayoutInflater.from(parent.context).inflate(R.layout.item_photo, parent, false)
return PhotoViewHolder(itemView)
}
override fun onBindViewHolder(holder: PhotoViewHolder, position: Int) {
val photo = photos[position]
holder.bind(photo)
}
override fun getItemCount(): Int {
return photos.size
}
}
```
其中,`R.layout.item_photo` 是每个照片的布局,`getItemCount()` 方法返回照片的数量,`onCreateViewHolder()` 方法创建 ViewHolder 对象,`onBindViewHolder()` 方法绑定数据到 ViewHolder 上。
阅读全文