2012-08-03 17 views
56

मेरी प्रोजेक्ट में मुझे एक छवि को एक स्क्लाइट डेटाबेस में स्टोर करने की आवश्यकता है और इसे मेरे एंड्रॉइड एमुलेटर में दिखाने के लिए भी पुनर्प्राप्त करने की आवश्यकता है। जब मैं एन्कोडेड स्ट्रिंग को डीकोड करने के बाद इसे सीधे दिखाता हूं, जो मुझे सॉकेट का उपयोग करके जावा क्लास से मिला, तो छवि वहां प्रदर्शित होती है। लेकिन जब मैं फिर से डेटाप्रकार ब्लॉब साथ SQLite डेटाबेस में तार का एक बाइट सरणी कोड की दुकान और फिर इसे getblob() समारोह यह एक अलग मान का उपयोग करके निकालते हैं और यह त्रुटि आती:स्टोर (बिटमैप छवि) को कैसे स्टोर करें और एंड्रॉइड में स्क्लाइट डेटाबेस से छवि पुनर्प्राप्त करें?

JAVA.lang.NULLPointerException: Factory returns null. 

मैं एक सुझाव की जरूरत है एक बिटमैप छवि को एक SQLite डेटाबेस में संग्रहीत करने के लिए और इसे SQLite डेटाबेस से पुनर्प्राप्त करने के लिए भी।

+2

इसे यहाँ –

+0

[सुझाव] (http अपने कोड पोस्ट करने के लिए बेहतर है में यह कर: // stackoverflow .com/a/9141116/996493) – Lucifer

+1

चेच [यह आउट] (http://stackoverflow.com/questions/4342798/displaying-image-from-the-sqlite-डेटा-using- कर्सर-in-android)। – tolgap

उत्तर

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. डेटाबेस से पुनर्प्राप्त करते समय, आपके पास निश्चित रूप से छवि का एक बाइट सरणी है, आपको बाइट सरणी को वापस मूल छवि में परिवर्तित करने के लिए क्या करना है। तो, आपको डीकोड करने के लिए बिटमैप फैक्ट्री का उपयोग करना होगा।

    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

@ लाज़ी निंजा, ** तालिका बनाएं ** से पहले एक उद्धरण जोड़ें (** "**), मैं इस मामूली संपादन को करने में सक्षम नहीं हूं। – Sayka

+1

DbBimapUtility – Sayka

+3

@LazyNinja के लिए Thnx, मैं बिटमैप छवियों और तारों को स्टोर और पुनः प्राप्त करने में आपकी सहायता करने के लिए आपके उत्तर का उपयोग कर रहा हूं। यह पोस्ट बहुत उपयोगी है! मुझे "डेटाबेस में डालने" के बारे में एक सवाल था। लाइन "डेटाबेस.इन्सर्ट (डीबी_TABLE, शून्य, सीवी);", आप डेटाबेस को कैसे परिभाषित कर रहे हैं? – Natalie

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); 

     } 

    }