2017-09-21 6 views
2

J'utilise la bibliothèque de persistance de pièce pour mon application androïde, maintenant je dois insérer l'image dans mon DB. J'ai réussi à définir @Entity pour le type de données primitif. et aussi à travers la classe de convertisseur, j'ai stocké tout objet, date, heure. Maintenant, je dois stocker Image. Je ne suis pas en mesure de comprendre comment nous définissons l'info et l'entité Column et comment nous insérons ces données ainsi que de lire les données de la table.Comment insérer une image dans une bibliothèque de persistance de pièce?

Quelle est la taille maximale des données insérées dans une seule ligne? Quelle est la taille maximale et minimale des données dans un champ dans Android SQLite?

+0

Vous pouvez utiliser blob pour stocker une image dans la pièce. – Reena

+0

Suivez ce https://developer.android.com/topic/libraries/architecture/room.html – Ankita

+0

@Ankita dans la persistance de la pièce comment nous utilisons dans le document qu'ils ignorent BitMap –

Répondre

6

Il n'est généralement pas recommandé de stocker des données d'image dans la base de données. Mais si cela est nécessaire pour votre projet, vous pouvez le faire.

Les données d'image sont généralement stockées dans db en utilisant le type de données BLOB, salle offrent également un soutien pour le type de données BLOB Documentation

Vous pouvez déclarer votre classe d'entité comme mentionné ci-dessous pour stocker les données d'image.

@Entity(tableName = "test") 
public class Test{ 

@PrimaryKey 
@ColumnInfo(name = "_id") 
private int id; 

@ColumnInfo(typeAffinity = ColumnInfo.BLOB) 
private byte[] image; 
} 
+0

Merci à son travail. J'ai besoin d'ajouter un encodeur et un décodeur qui convertissent l'image brute en byte [] et byte [] en image brute –

+0

@PrinceKumar Vrai, vous avez besoin d'encodeur et de décodeur pour bitmap à byte [] et vice versa. – Pinakin

+0

Je ne peux pas utiliser le type Blob? –

0

Comme Pinakin mentionné, il est recommandé de ne pas stocker une image dans la base de données et le chemin de fichier serait mieux mais s'il est nécessaire de stocker l'image je suggère compresser l'image à moins de 2 Mo (here is an example) pour éviter casser l'application. Room prend en charge BLOB pour l'image. classe Entité Kotlin:

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 
    } 

En DatabaseHelper quelque chose comme

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 
    } 

-moi si je me trompe. J'espère que cela aidera quelqu'un là-bas

+0

Merci pour l'explication de chaque ligne et la solution facile à comprendre mon projet entier en Java. –