2017-09-21 35 views
2

我爲我的Android應用程序使用房間持久性庫,現在我必須在我的數據庫中插入圖像。我成功地爲原始數據類型定義了@Entity。也通過轉換器類,我存儲了所有的對象,日期,時間。現在我必須存儲圖像。我無法理解我們如何定義列信息和實體,以及如何插入數據以及如何從表中讀取數據。如何在房間持久性庫中插入圖像?

插入單行的數據的最大大小是多少? Android SQLite的一個字段中數據的最大和最小大小是多少?

+0

您可以使用blob在房間中存儲圖像。 – Reena

+0

按照此https://developer.android.com/topic/libraries/architecture/room.html – Ankita

+0

@Ankita室內持久性,我們他們忽略的BitMap –

回答

6

通常不建議將圖像數據存儲到數據庫中。 但是,如果它是您的項目需要,那麼你可以這樣做。

的圖像數據通常被存儲到使用BLOB數據類型分貝,客房還提供支持BLOB數據類型Documentation

提到以下存儲圖像數據可以聲明實體類。

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

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

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

感謝它的工作。我需要添加編碼器和解碼器,將原始圖像轉換爲字節[]和字節[]到原始圖像 –

+0

@PrinceKumar True,需要將位圖的編碼器和解碼器轉換爲字節[],反之亦然。 – Pinakin

+0

我不能使用Blob類型? –

0

正如Pinakin提到的,不建議將圖像存儲到數據庫和文件路徑會更好,但如果需要存儲圖像,我建議將圖像壓縮到低於2 MB(here is an example),以避免打破應用。房間支持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 
    } 

糾正我,如果我錯了。希望這可以幫助那裏的人

+0

感謝每一行的解釋和易於理解的解決方案我在java中的整個項目。 –