【问题标题】:Android Save images to SQLite or SDCard or memoryAndroid 将图像保存到 SQLite 或 SDCard 或内存
【发布时间】:2012-02-14 07:08:38
【问题描述】:

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

谢谢, 无

【问题讨论】:

  • 您可以在SQlite数据库中保存图像的路径,并可以轻松检索。但如果不幸的是你删除了你已经存储的图像,那么你需要抓住这个。让我知道如果有兴趣会给你它的示例代码。
  • 我遇到了这个问题,我曾经将图像路径保存到数据库以获得灵活性和快速工作,我建议不要像图像一样将二进制值保存到数据库中,使用内存来保存图像并使用数据库保存图像路径。 Kurtis Nusbaum 给出的答案得到了很好的解释。
  • @nilMoBile 你应该检查我的answer 它可能对你有帮助:)
  • @OnkarDhane 我在这里做同样的事情。如果您能将此项目的示例代码分享给我,我将不胜感激。因为我想将图像的路径存储到数据库中(不想使用 blob)而且我没有走得更远。

标签: android sqlite


【解决方案1】:

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

 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。现在,把它放在第二个代码中。U可以根据需要得到微型或迷你缩略图

【讨论】:

  • 这似乎是一个很好的方式,你有没有使用你提到的缩略图方式的示例。
  • 您必须使用 uri 来获取位图缩略图。我正在编辑中发布代码。我对答案感到满意然后接受它
  • 我认为这是您的另一个问题,因此最好先搜索,如果您没有得到任何解决方案,请再次在 SO.@nilMoBile 上提出问题
【解决方案2】:

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

【讨论】:

  • 如果用户删除我的应用程序的图像怎么办?
  • 如果图像在内部存储中,则只能由您的应用访问(这意味着用户无法删除它们)。如果您将它们存储在 SD 卡上,那么您需要编写代码以处理用户删除您的图像的情况。查看如何使用内部存储:developer.android.com/training/basics/data-storage/files.html
【解决方案3】:

如果您需要下载图片并保存在 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();
        }
    }



}

【讨论】:

    【解决方案4】:

    这是应用程序需求及其实现的问题。我建议使用内部或 sd 卡来存储图像并将路径保存在 db 中

    【讨论】:

    • 如果用户从外部进入 sd 卡并删除我的应用程序图像怎么办?
    • 是的 SD 卡存储在应用程序之间共享,因此您可能会删除应用程序图像,因此您始终可以将图像保存到应用程序的私有内存中。根据原始问题关注位图缓存也可以用作增强用户体验的附加组件。
    【解决方案5】:

    存储任何不需要根据应用的查询(如图像、视频)返回该数据子部分的行为的大量数据,不应存储在数据库中,而应仅存储对该数据的引用.

    【讨论】:

    • 当移动用户删除我的应用程序图像时怎么办?
    猜你喜欢
    • 1970-01-01
    • 2014-07-28
    • 1970-01-01
    • 2021-11-05
    • 2015-09-27
    • 1970-01-01
    • 1970-01-01
    • 2012-12-16
    • 2013-10-28
    相关资源
    最近更新 更多