Как вставить изображение в библиотеку сохранения пространства?
Я использую библиотеку сохранения пространства для моего приложения для Android. Теперь мне нужно вставить изображение в свой db. Я успешно определяю @Entity для примитивного типа данных. а также через класс преобразователя, я сохранил весь объект, дату, время. Теперь я должен хранить изображение. Я не могу понять, как мы определяем информацию и сущность столбца и как мы вставляем эти данные, а также читаем данные из таблицы.
Каков максимальный размер данных, вставленных в одну строку? Каков максимальный и минимальный размер данных в одном поле в Android SQLite?
Ответы
Ответ 1
Обычно не рекомендуется хранить данные изображения в базе данных.
Но если это требуется для вашего проекта, вы можете сделать это.
Данные изображения обычно хранятся в db с использованием типа данных BLOB. Room также обеспечивает поддержку типа данных BLOB Документация
Вы можете объявить свой класс сущности, как указано ниже, для хранения данных изображения.
@Entity(tableName = "test")
public class Test{
@PrimaryKey
@ColumnInfo(name = "_id")
private int id;
@ColumnInfo(typeAffinity = ColumnInfo.BLOB)
private byte[] image;
}
Ответ 2
Как упоминал Пинакин, не рекомендуется хранить изображение в базе данных, и путь к файлу будет лучше, но если требуется сохранить изображение, я бы предложил сжать изображение ниже 2 МБ (вот пример), чтобы избежать взлома приложения. Комната поддерживает BLOB для изображения.
Класс сущности в котлине:
ImageTest.kt
@Entity
class ImageTest {
@PrimaryKey(autoGenerate = true)
var id: Int = 1
@ColumnInfo(typeAffinity = ColumnInfo.BLOB)
var data: ByteArray? = null
}
ImageDao.kt
@Dao
interface ImageTestDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
fun upsertByReplacement(image: List<ImageTest>)
@Query("SELECT * FROM image")
fun getAll(): List<ImageTest>
@Query("SELECT * FROM image WHERE id IN (:arg0)")
fun findByIds(imageTestIds: List<Int>): List<ImageTest>
@Delete
fun delete(imageTest: ImageTest)
}
Databse.kt
import android.arch.persistence.room.Database
import android.arch.persistence.room.RoomDatabase
import android.arch.persistence.room.TypeConverters
@Database(entities = arrayOf(ImageTest::class), version = 1)
@TypeConverters(DataConverters::class)
abstract class Database : RoomDatabase() {
abstract fun getImageTestDao(): ImageTestDao
}
В DatabaseHelper что-то вроде
class DatabaseHelper(context: Context) {
init {
DatabaseHelper.context = WeakReference(context)
}
companion object {
private var context: WeakReference<Context>? = null
private const val DATABASE_NAME: String = "image_test_db"
private var singleton: Database? = null
private fun createDatabase(): Database {
return Room.databaseBuilder(context?.get() ?:
throw IllegalStateException("initialize by calling
constructor before calling DatabaseHelper.instance"),
Database::class.java,
DATABASE_NAME)
.build()
}
val instance: Database
@Synchronized get() {
if (null == singleton)
singleton = createDatabase()
return singleton as Database
}
fun setImage(img: Bitmap){
val dao = DatabaseHelper.instance.getImageTestDao()
val imageTest = ImageTest()
imageTest.data = getBytesFromImageMethod(image)//TODO
dao.updsertByReplacement(imageTest)
fun getImage():Bitmap?{
val dao = DatabaseHelper.instance.getImageTestDao()
val imageByteArray = dao.getAll()
return loadImageFromBytes(imageByteArray[0].data)
//change accordingly
}
Исправьте меня, если я ошибаюсь. Надеюсь, это поможет кому-то там.