Android将图像保存到SQLite、SD卡或内存

Android将图像保存到SQLite、SD卡或内存,android,sqlite,Android,Sqlite,我需要从服务器获取图像和一些其他数据,然后将其显示在列表中。但由于记录的数量可能相当大,所以我不确定是应该将图像保存到SQLite数据库,还是将其保存到SD卡,还是将其保存到内存中 谢谢, nil通常认为,像在数据库中保存图像那样保存二进制数据是不好的。在大多数情况下,由于某些技术原因,它实际上会损害数据库的性能。相反,将要缓存的图像保存到SD卡,并将这些图像的文件路径存储在数据库中。始终养成将图像路径保存到数据库的习惯。对于列表视图,请确保只使用这些图像的缩略图。这将帮助您在列表中快速加载这些

我需要从服务器获取图像和一些其他数据,然后将其显示在列表中。但由于记录的数量可能相当大,所以我不确定是应该将图像保存到SQLite数据库,还是将其保存到SD卡,还是将其保存到内存中

谢谢,
nil

通常认为,像在数据库中保存图像那样保存二进制数据是不好的。在大多数情况下,由于某些技术原因,它实际上会损害数据库的性能。相反,将要缓存的图像保存到SD卡,并将这些图像的文件路径存储在数据库中。

始终养成将图像路径保存到数据库的习惯。对于列表视图,请确保只使用这些图像的缩略图。这将帮助您在列表中快速加载这些图像

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

这里anniEntry.getUri()是图像uri。现在,将其放在第二个代码中。您可以根据需要获取微型或微型缩略图,这取决于应用程序需求及其实现。我建议使用内部或sd卡存储图像,并将其保存在db中。存储任何重数据时,不需要根据应用的查询返回数据的子部分(如图像、视频),不应存储在数据库中,相反,只应存储对该数据的引用。

如果您必须下载图像并保存在SD卡中。请遵循以下代码:

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



}

您可以在SQlite数据库中保存图像的路径,并可以轻松地检索它。但如果不幸地删除了已存储的图像,则需要捕获该图像。让我知道,如果有兴趣的话,我会给你一些示例代码。我谈到这个问题,为了灵活性和快速工作,我经常将图像路径保存到数据库中,我建议不要像图像那样将二进制值保存到数据库中,使用内部内存保存图像,使用数据库保存图像路径。Kurtis Nusbaum给出的答案解释得很好。@nilMoBile您应该检查我的答案,它可能会对您有所帮助:)@OnkarDhane我正在做同样的事情。我很感激如果你能分享这个项目的样本代码给我。因为我想将图像的路径存储到数据库中(不想使用blob),所以我不会再进一步了。这似乎是一个很好的方法,您是否有任何示例可以使用您提到的缩略图方式。您必须使用uri来获取位图缩略图。我正在编辑中发布代码。我对答案感到满意,然后接受它。我认为这是您的另一个问题,所以最好先搜索,如果没有找到任何解决方案,然后再提出问题。@nilmobile如果用户从外部转到sd卡并删除我的应用程序映像怎么办?是的,sd卡存储在应用程序之间共享,因此您可能可以删除应用程序映像,因此,您可以始终将图像保存到专用内存中以供应用。。根据最初的问题,位图缓存也可以用作附加组件以增强用户体验。当移动用户删除我的应用程序图像时会发生什么?如果用户删除我的应用程序图像会发生什么?如果图像位于内部存储中,则只能由你的应用程序访问(这意味着用户无法删除它们)。如果将它们存储在SD卡上,则需要编写代码,以便处理用户删除图像的情况。有关如何使用内部存储的信息,请查看以下内容: