2012-02-14 16 views
15

Potrzebuję pobrać obrazy i inne dane z serwera, a następnie wyświetlić je na liście. Ale ponieważ liczba rekordów może być dość duża, nie jestem pewien, czy powinienem zapisać obrazy w bazie danych SQLite, czy zapisać ją na karcie SD lub zapisać w pamięci.Android Zapisywanie obrazów w SQLite lub na karcie SD lub w pamięci

Dzięki, nil

+2

można zapisać ścieżkę obrazów w bazie danych SQLite i można go łatwo odzyskać. ale jeśli niestety usuniesz obraz, który już zapisałeś, musisz go złapać. daj mi znać, jeśli zainteresowana da Ci przykładowy kod. – OnkarDhane

+0

@nilMoBile należy sprawdzić moje [Odpowiedź] (http://stackoverflow.com/a/9141116/996493) może pomóc :) – Lucifer

+0

doszedłem do tego problemu i służy do zapisywania obrazu ścieżkę do bazy danych dla elastyczności i Szybka praca, nie zaleca się zapisywania wartości binarnych do bazy danych, takich jak obrazy, Użyj pamięci wewnętrznej do zapisywania obrazów i używanej bazy danych, aby zapisać ścieżkę obrazów. Odpowiedź udzielona przez Kurtisa Nusbauma jest dobrze wyjaśniona. – RobinHood

Odpowiedz

18

Zawsze zwyczaj zapisywania obrazów ścieżkę do bazy danych. Aby wyświetlić widok listy, pamiętaj, by użyć tylko miniatury tego obrazu. Pomoże to w szybkim ładowaniu tych obrazów na liście.

long selectedImageUri = ContentUris.parseId(Uri.parse(anniEntry.getUri())); 
Bitmap bm = MediaStore.Images.Thumbnails.getThumbnail(
        mContext.getContentResolver(), selectedImageUri,MediaStore.Images.Thumbnails.MICRO_KIND, 
        null); 

Tutaj anniEntry.getUri() jest obrazem uri.Now, umieścić go w drugim code.U można uzyskać miniaturkę mikro lub mini zgodnie z wymogiem

+0

który wydaje doskonały sposób, aby przejść z, masz jakieś próbki do korzystania sposób, w jaki wspomniałeś o miniaturach. – nilMoBile

+0

Musisz użyć URI, aby uzyskać miniaturkę Bitmapy. Zamieszczam kod w edycji. Jesteś zadowolony z odpowiedzi, a następnie zaakceptuj to. –

+1

Myślę, że to są twoje inne problemy, więc lepiej jest najpierw je wyszukać, a jeśli nie. uzyskać jakieś rozwiązanie, a następnie ponownie podnieść pytanie na SO. @ nilMoBile – RobinHood

12

Jest powszechnie uważane zła forma, aby zapisać dane binarne jak obraz w bazie danych. W większości przypadków, z przyczyn technicznych, może to doprowadzić do uszkodzenia wydajności bazy danych. Zamiast tego zapisz obrazy, które chcesz zapisać w pamięci podręcznej na karcie SD i po prostu zapisz ścieżkę do pliku tych obrazów w bazie danych.

+1

co, jeśli użytkownik usunie obrazy z mojej aplikacji? –

+2

Jeśli obrazy znajdują się w pamięci wewnętrznej, jest dostępna tylko dla Twojej aplikacji (co oznacza, że ​​użytkownik nie może ich usunąć). Jeśli przechowujesz je na karcie SD, musisz napisać swój kod tak, aby zajmował się przypadkiem, w którym użytkownik usuwa twoje zdjęcie. Sprawdź to na jak używać pamięci wewnętrznej: http://developer.android.com/training/basics/data-storage/files.html –

1

To kwestia wymogu aplikacji i jej realizacji. Proponuję użyć karty wewnętrznej lub SD do przechowywania obrazów i zapisania tam ścieżki w db

+0

co, jeśli użytkownik zewnętrznie przejść do karty SD i usunąć moje obrazy aplikacji? –

+1

Tak Przechowywanie kart SD jest współdzielone między aplikacjami, więc może się zdarzyć, że usuniesz obrazy aplikacji, dzięki czemu zawsze możesz zapisywać obrazy w prywatnej pamięci dla aplikacji.Zgodnie z pierwotnym pytaniem dotyczy pamięci podręcznej bitmap może być również używany jako dodatek do zwiększenia wygody użytkownika. – Relsell

1

Przechowywanie wszelkich ciężkich danych, które nie wymagają zachowania powracających pod-części tych danych w oparciu o zastosowane zapytanie (np. Obrazy, wideo), nie powinny być przechowywane w bazie danych, a jedynie zapisywanie odniesienia do tych danych.

+0

co, jeśli użytkownik mobilny usunie moje obrazy aplikacji? –

3

Jeśli trzeba pobrać obrazy & Zapisz w SDcard.Kindly śledzić poniżej kodu:

package com.tablet; 

import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.ProtocolException; 
import java.net.URL; 
import java.net.UnknownHostException; 


import android.app.Activity; 
import android.content.Context; 
import android.content.Intent; 
import android.net.ConnectivityManager; 
import android.net.NetworkInfo; 
import android.os.Bundle; 
import android.os.Environment; 
import android.os.Handler; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.Toast; 

/* 
* This class download & store the media in external storage 
* */ 
public class DownloadActivity extends Activity { 

    private static String fileName = "android.jgp"; 

    private Button btnDownload; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     btnDownload = (Button) findViewById(R.id.download); 
     btnDownload.setOnClickListener(new View.OnClickListener() { 

      public void onClick(View view) { 
       // TODO Auto-generated method stub 
       download(); 
      } 
     }); 


    private void download() 
    { 
     System.out.println("Inside Download"); 
     try { 
      // this is the file you want to download from the remote server 
      String path = "http://code.google.com/android/goodies/wallpaper/android-wallpaper5_1024x768.jpg"; 

      URL u = new URL(path); 
      HttpURLConnection c = (HttpURLConnection) u.openConnection(); 
      c.setRequestMethod("GET"); 
      c.setDoOutput(true); 
      c.connect(); 

      String PATH = "/data/Kamal" 
       //Environment.getExternalStorageDirectory() 
      // + "/download/"; 
        + "/"; 

      Log.v("log_tag", "PATH: " + PATH); 
      File file = new File(PATH); 
      file.mkdirs(); 
      File outputFile = new File(file, fileName); 

      FileOutputStream f = new FileOutputStream(outputFile); 
      InputStream in = c.getInputStream(); 
      Log.v("log_tag"," InputStream consist of : "+in.read()); 
      byte[] buffer = new byte[1024]; 
      int len1 = 0; 
      while ((len1 = in.read(buffer)) > 0) { 
       //System.out.println("Reading byte : "+in.read(buffer)); 
       f.write(buffer, 0, len1); 
      } 
      Toast.makeText(this, "Download Completed Successfully @ "+PATH, Toast.LENGTH_LONG).show(); 
      f.close(); 


     } catch (MalformedURLException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      Toast.makeText(this, "MalformedURLException", Toast.LENGTH_LONG).show(); 
     } catch (ProtocolException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      Toast.makeText(this, "ProtocolException", Toast.LENGTH_LONG).show(); 
     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      Toast.makeText(this, "FileNotFoundException", Toast.LENGTH_LONG).show(); 
     }catch (UnknownHostException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      Toast.makeText(this, "UnknownHostException", Toast.LENGTH_LONG).show(); 
     } 
     catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
      Toast.makeText(this, "IOException", Toast.LENGTH_LONG).show(); 
     } 
    } 



} 
Powiązane problemy