2012-08-03 82 views
56

在我的項目中,我需要將圖像存儲到sqlite數據庫中,並且還需要檢索它以顯示在我的android模擬器中。當我在使用套接字從Java類獲得的編碼字符串解碼後直接顯示它時,圖像顯示在那裏。但是,當我再次存儲字符串的字節數組碼與數據類型BLOB SQLite數據庫,然後通過使用getblob()功能包含不同的值進行檢索,並出現此錯誤:如何在android中存儲(位圖圖像​​)和從sqlite數據庫檢索圖像?

JAVA.lang.NULLPointerException: Factory returns null. 

我需要一個建議將位圖圖像存儲到sqlite數據庫中,並從sqlite數據庫中檢索它。

+2

這是更好地在這裏 – 2012-08-03 06:03:14

+0

[建議](HTTP POST代碼://計算器.com/a/9141116/996493) – Lucifer 2012-08-03 06:03:22

+1

Chech [this out](http://stackoverflow.com/questions/4342798/displaying-image-from-the-sqlite-database-using-cursor-in-android)。 – tolgap 2012-08-03 06:03:50

回答

127

建立數據庫

public class DatabaseHelper extends SQLiteOpenHelper { 
    // Database Version 
    private static final int DATABASE_VERSION = 1; 

    // Database Name 
    private static final String DATABASE_NAME = "database_name"; 

    // Table Names 
    private static final String DB_TABLE = "table_image"; 

    // column names 
    private static final String KEY_NAME = "image_name"; 
    private static final String KEY_IMAGE = "image_data"; 

    // Table create statement 
    private static final String CREATE_TABLE_IMAGE = "CREATE TABLE " + DB_TABLE + "("+ 
         KEY_NAME + " TEXT," + 
         KEY_IMAGE + " BLOB);"; 

    public DatabaseHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 

     // creating table 
     db.execSQL(CREATE_TABLE_IMAGE); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // on upgrade drop older tables 
     db.execSQL("DROP TABLE IF EXISTS " + DB_TABLE); 

     // create new table 
     onCreate(db); 
    } 
} 

在數據庫中插入:

public void addEntry(String name, byte[] image) throws SQLiteException{ 
    SQLiteDatabase database = this.getWritableDatabase(); 
    ContentValues cv = new ContentValues(); 
    cv.put(KEY_NAME, name); 
    cv.put(KEY_IMAGE, image); 
    database.insert(DB_TABLE, null, cv); 
} 

檢索數據

byte[] image = cursor.getBlob(1); 

注:

  1. 之前插入到數據庫中,你需要位圖圖像先轉換成字節數組,然後利用數據庫查詢應用它。
  2. 當從數據庫中檢索時,你肯定有一個字節數組的圖像,你需要做的是將字節數組轉換回原始圖像。所以,你必須利用BitmapFactory解碼。

下面是我希望的實用工具類可以幫助你:

public class DbBitmapUtility { 

    // convert from bitmap to byte array 
    public static byte[] getBytes(Bitmap bitmap) { 
     ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
     bitmap.compress(CompressFormat.PNG, 0, stream); 
     return stream.toByteArray(); 
    } 

    // convert from byte array to bitmap 
    public static Bitmap getImage(byte[] image) { 
     return BitmapFactory.decodeByteArray(image, 0, image.length); 
    } 
} 


進一步閱讀
如果你不熟悉如何插入和檢索到數據庫,通過這個tutorial

+2

@Lazy Ninja,在** CREATE TABLE **之前添加一個引號(**「**),我無法做這個小修改。 – Sayka 2015-09-30 07:03:39

+1

Thnx爲DbBimapUtility – Sayka 2015-09-30 07:05:13

+3

@LazyNinja,我使用您的答案來幫助我存儲和檢索位圖圖像和字符串。這篇文章非常有幫助!我有一個關於如何「插入數據庫」的問題。在「database.insert(DB_TABLE,null,cv);」一行上,你如何定義數據庫? – Natalie 2016-05-13 23:06:08

5
按鈕

點擊寫這

Intent in = new Intent(
        Intent.ACTION_PICK, 
        android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI); 
      in.putExtra("crop", "true"); 
      in.putExtra("outputX", 100); 
      in.putExtra("outputY", 100); 
      in.putExtra("scale", true); 
      in.putExtra("return-data", true); 

      startActivityForResult(in, 1); 

然後做在你的活動

@Override 
    protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
     // TODO Auto-generated method stub 
     super.onActivityResult(requestCode, resultCode, data); 

     if (requestCode == 1 && resultCode == RESULT_OK && data != null) { 

      Bitmap bmp = (Bitmap) data.getExtras().get("data"); 

      img.setImageBitmap(bmp); 
      btnadd.requestFocus(); 

      ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
      bmp.compress(Bitmap.CompressFormat.JPEG, 100, baos); 
      byte[] b = baos.toByteArray(); 
      encodedImageString = Base64.encodeToString(b, Base64.DEFAULT); 

      byte[] bytarray = Base64.decode(encodedImageString, Base64.DEFAULT); 
      Bitmap bmimage = BitmapFactory.decodeByteArray(bytarray, 0, 
        bytarray.length); 

     } 

    } 
相關問題