【问题标题】:Saving Multiple Images in SQLite在 SQLite 中保存多个图像
【发布时间】:2016-05-14 05:46:33
【问题描述】:

您好,在我的项目中,我有一个搜索栏,用户可以在其中输入动物名称,我的应用程序将显示该动物的动画图片 (.gif)。 我目前将图像的路径保存在我的 SQLite 数据库中。我有两个问题

a) 我的数据库目前只包含 1 张图片,我该如何扩展它,我是否必须为每个图片文件重新编写代码?

b) 搜索将如何进行?它会按名称搜索图像还是我必须为图像标签创建另一个列然后按它搜索。

这是我的代码:

import android.app.Activity;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class ImageDatabase extends Activity{

private ImageView mImageView;
private SQLiteDatabase db;

@Override
protected void onCreate(Bundle savedInstanceState){

    super.onCreate(savedInstanceState);
    mImageView = (ImageView) findViewById(R.id.image_view);
    db = openOrCreateDatabase("Image.db", Context.MODE_PRIVATE, null);
    db.execSQL("Create Table if not exists tb (a blob)");
}

public void  saveImage(View view){

    try {
        FileInputStream fis = new FileInputStream("/storage/sdcard/gif_file.gif");
        byte[] image = new byte[fis.available()];
        fis.read(image);

        ContentValues values = new ContentValues();
        values.put("a", image);
        db.insert("ImageTable", null, values);

        fis.close();
    }
    catch (IOException e){
        e.printStackTrace();
    }

}
public void  getImage(View view){

    Cursor c = db.rawQuery("select = from tb", null);

    if (c.moveToNext()){
        byte[] image = c.getBlob(0);
        Bitmap bmp = BitmapFactory.decodeByteArray(image, 0, image.length);
        mImageView.setImageBitmap(bmp);
    }

}

}

【问题讨论】:

    标签: java android android-studio android-sqlite


    【解决方案1】:

    a) 我的数据库目前只包含 1 张图片,我该如何扩展它,我是否必须为每个图片文件重新编写代码?

    当然不是,在你保存图片的方法saveImage中,可以将保存图片的路径作为参数传递,使其通用。 FileInputStream 没有硬编码值,但会使用此参数。像这样的:

    public void saveImage(String filePath) {
        try {
            FileInputStream fis = new FileInputStream(filePath);
            ...
        }
    }
    

    当然要对路径进行一些检查或正确管理异常。 我不知道你应用的架构,请不要将实际图像存储在数据库中,而是一个TEXT与图像的路径。

    另外,您似乎没有在方法中使用View view 参数,因此您可以将其删除。

    b) 搜索将如何进行?它会按名称搜索图像还是我必须为图像标签创建另一个列然后按它搜索。

    这取决于您的应用程序:如果用户可以向图像添加标签,或者应用程序可能会自动添加标签(即类别),那么您可以为用户提供标签搜索的可能性,否则不能。所以你将简单地按名称搜索:请考虑一个文件可以有任何名称,与图像的实际内容完全无关,所以你最好考虑另一种策略来改进你的搜索功能。

    【讨论】:

    • 我目前计划在我的应用程序中添加 150 只动物,用户无法添加或删除它们,他们只能阅读它们。所以我认为按名称搜索应该可以。其次,所以我的代码必须看起来像 FileInputStream fis = new FileInputStream("/storage/sdcard/Images); 并且在这个文件夹中将是我的图像,所以我可以这样读取它们吗?
    • @HeroicJokester 您应该提供有关您的应用程序架构的更多详细信息:您是否将图像嵌入到应用程序中?你是从网络上下载的吗?基于这些点,最好的方法可以改变。
    • 是的,我已经准备了所有 150 个 gif,我想通过将它们存储在手机的内部或外部存储器中来将它们添加到我的应用程序中。用户无法编辑或更改它们,用户只需搜索动物的名称,我的应用程序将显示具有该名称的图像。这就是所有的功能。 (PS 我也在考虑添加语音输入,但那是以后再说)。
    • @HeroicJokester 您打算将它们添加到用户将从 Google Play 下载的应用程序中,还是在应用程序启动时从服务器下载它们?在第一种情况下,请看这里:stackoverflow.com/questions/9563373/…。然后如果用户修改了一张图片,你可以将它保存在外部存储中,这样原始图片就不会被覆盖。请考虑,如果您使用数据库只是为了执行搜索,那么您也可以在没有数据库支持的情况下搜索文件夹中的文件。
    • 嗯,哈哈,这正是我想要做的,我只想从用户那里获取输入并从我的存储中搜索图像并向他显示该图像。如果我可以在不使用数据库的情况下做到这一点,请告诉我怎么做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-03
    • 2012-07-03
    • 2016-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多