2011-07-25 18 views
4

URLから画像を取得しています。 画像をキャッシュする代わりに、SQLiteデータベースに画像を保存することは可能でしょうか?URLから取得した画像をSQLiteデータベースに保存する方法は?

   /** Simple Constructor saving the 'parent' context. */ 
       public ImageAdapter(Context c) { this.myContext = c; } 





       /** Returns the amount of images we have defined. */ 
       public int getCount() { return this.myRemoteImages.length; } 

       /* Use the array-Positions as unique IDs */ 
       public Object getItem(int position) { return position; } 
       public long getItemId(int position) { return position; } 

       /** Returns a new ImageView to 
       * be displayed, depending on 
       * the position passed. */ 
       public View getView(int position, View convertView, ViewGroup parent) { 
       ImageView i = new ImageView(this.myContext); 

       try { 

           URL aURL = new URL(myRemoteImages[position]); 
           URLConnection conn = aURL.openConnection(); 

           conn.connect(); 

           InputStream is = conn.getInputStream(); 
           /* Buffered is always good for a performance plus. */ 
           BufferedInputStream bis = new BufferedInputStream(is); 
           /* Decode url-data to a bitmap. */ 

           Bitmap bm = BitmapFactory.decodeStream(bis); 
           bis.close(); 
           is.close(); 
           Log.v(imageUrl, "Retrieving image"); 

           /* Apply the Bitmap to the ImageView that will be returned. */ 
           i.setImageBitmap(bm); 
         } catch (IOException e) { 

           Log.e("DEBUGTAG", "Remtoe Image Exception", e); 
         } 

       /* Image should be scaled as width/height are set. */ 
       i.setScaleType(ImageView.ScaleType.FIT_CENTER); 
       /* Set the Width/Height of the ImageView. */ 
       if(Build.VERSION.SDK_INT >= 11){ 
        i.setLayoutParams(new Gallery.LayoutParams(450, 300)); 
       return i; 
       } 
       else{ 
        i.setLayoutParams(new Gallery.LayoutParams(125, 125)); 
        return i; 
       } 

       } 

       /** Returns the size (0.0f to 1.0f) of the views 
       * depending on the 'offset' to the center. */ 
       public float getScale(boolean focused, int offset) { 
       /* Formula: 1/(2^offset) */ 
       return Math.max(0, 1.0f/(float)Math.pow(2, Math.abs(offset))); 
       } 
       } 

EDIT:ギャラリー

((Gallery) findViewById(R.id.gallery)) 
          .setAdapter(new ImageAdapter(MainMenu.this)); 
+3

なぜそれらをsdcardに保存しないのですか? – Kaj

+0

私は上記のコードからの例を提供できますか?またはあなたが知っているチュートリアル。ありがとう – yoshi24

答えて

8
protected Drawable Imagehandler(String url) { 
     try { 
      url=url.replaceAll(" ", "%20"); 
      InputStream is = (InputStream)this.fetch(url); 
      Drawable d = Drawable.createFromStream(is, "src"); 
      return d; 
     } catch (MalformedURLException e) 
     { 
      System.out.println(url); 
      System.out.println("error at URI"+e); 
      return null; 
     } 
     catch (IOException e) 
     { 
      System.out.println("io exception: "+e); 
      System.out.println("Image NOT FOUND"); 
      return null; 
     } 
    } 

    protected Object fetch(String address) throws MalformedURLException,IOException { 
     URL url = new URL(address); 
     Object content = url.getContent(); 
     return content; 
    } 

このファイルを書き込むことができ、その後、ギャラリーのImageViewのにDrawbleを設定

+0

これは私のコードとどうやって統合するのでしょうか?ベースアダプタを拡張しているimageLoaderを置き換えることはできますか? – yoshi24

5

で画像をロードするためにimageAdapterを設定屋あなたは

public static Bitmap getImageFromBLOB(byte[] mBlob) { 
     byte[] bb = mBlob; 
     return BitmapFactory.decodeByteArray(bb, 0, bb.length); 

    } 
を取得するには、データベース内のBLOBとして

public static byte[] urlToImageBLOB(String url) throws IOException { 
     httpclient = new DefaultHttpClient(); 
     entity = null; 
     httpGet = new HttpGet(url); 
     response = httpclient.execute(httpGet); 
     if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { 
      entity = response.getEntity(); 
     } 
     return EntityUtils.toByteArray(entity); 
    } 

を画像を保存することができます

//設定するimageView.setImageBitmap(getImageFromBLOB(cursor.getBlob(object.getColumnIndex("book_thumb"))));

+0

エンティティはデータベースに保存されますか?上記の画像を取得するためにコードを貼り付けました。 – yoshi24

+1

いいえ、あなたはここでBlobとしてフィールドを取らなければなりません(book_thumb) ContentValues value = new ContentValues(); value.put( "book_thumb"、urlToImageBLOB(url)); db.insertOrThrow(Table_name、null、value); これはあなたのイメージをBLOBとしてDBに保存します –

+0

どうすればそれを取得するのですか?それとも、Kajがコメントabovで言ったようにSDCardに保存する方が良いでしょうか? – yoshi24

4

は、ここでは、外部記憶装置にデータを格納する方法へのリンクです:External storage

リンクは、ファイルを配置する場所(あなたが外部ストレージを使用する場合)について説明し、外部ストレージが利用可能かどうかをチェックします。

編集:ファイルへのアクセス方法については、「外部ストレージのファイルへのアクセス」のトピックで説明しています。

API 8以上でgetExternalFilesDir()を呼び出して、アプリケーションルートディレクトリを表すFileを取得する必要があります。あなたはその後、実行時にDrawbleためにあなたのIMAGEURLを変換します読んで、通常どおり(テキストデータ用などしてFileWriterとFileReaderのを使用して)

+0

リンクは、どのようにsdcardに保存するかを教えてくれません。空室状況を確認するだけですか? – yoshi24

+1

答えを更新しました。 – Kaj

関連する問題