2017-09-21 18 views
2

Ich verwende Raumpersistenz-Bibliothek für meine Android-Anwendung, jetzt muss ich Bild in meine DB einfügen. Ich habe erfolgreich @Entity für den primitiven Datentyp definiert. und auch durch Konverter Klasse, ich habe alle Objekte, Datum, Uhrzeit gespeichert. Jetzt muss ich Image speichern. Ich bin nicht in der Lage zu verstehen, wie wir Column Info und Entity definieren und wie wir diese Daten einfügen und Daten aus der Tabelle lesen.Wie Bild in Raumpersistenz Bibliothek einfügen?

Was ist die maximale Größe der Daten, die in die einzelne Zeile eingefügt wurden? Was ist die maximale und minimale Größe von Daten in einem Feld in Android SQLite?

+0

Sie können Blob verwenden, um Bild in Raum zu speichern. – Reena

+0

Folgen Sie dieser https://developer.android.com/topic/libraries/architecture/room.html – Ankita

+0

@Ankita in Raumpersistenz, wie wir in dem Dokument verwenden, ignorieren sie Bitmap –

Antwort

6

Es wird normalerweise nicht empfohlen, Bilddaten in der Datenbank zu speichern. Aber wenn es für Ihr Projekt erforderlich ist, können Sie dies tun.

Bilddaten werden in der Regel in db mit BLOB-Datentyp gespeichert ist, bietet Raum auch Unterstützung für BLOB-Datentyp Documentation

Sie Ihre Entitätsklasse unten wie erwähnt zum Speichern von Bilddaten erklären können.

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

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

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

Dank seiner Arbeit. Ich muss Encoder und Decoder hinzufügen, die Rohbild in Byte [] und Byte [] in Rohbild konvertieren –

+0

@PrinceKumar True, benötigen Sie Encoder und Decoder für Bitmap to Byte [] und umgekehrt. – Pinakin

+0

Ich kann Blob Typ nicht verwenden? –

0

Wie Pinakin erwähnte, ist es nicht besser empfohlen würde ein Bild zu speichern, in der Datenbank und Dateipfad sein, aber wenn es Bild zu speichern benötigt würde ich das Bild auf unter 2 MB (here is an example) vorschlagen komprimieren zu vermeiden brechende App. Raum unterstützt BLOB für Bild. Entity-Klasse in 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 
    } 

In DatabaseHelper so etwas wie

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 
    } 

mich korrigieren, wenn ich falsch bin. Hoffe, das hilft jemandem da draußen

+0

Danke für die Erklärung jeder Zeile und leicht verständliche Lösung mein ganzes Projekt in Java. –