在SQLite中保存多个图像

时间:2016-05-14 05:46:33

标签: java android android-studio android-sqlite

您好,在我的项目中,我有一个搜索栏,用户将在其中输入动物名称,我的应用程序将显示该动物的动画图片(.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);
    }

}

}

1 个答案:

答案 0 :(得分:0)

  

a)我的数据库目前仅包含1个图像,如何展开它,是否必须为每个图像文件再次编写代码?

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

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

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

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

  

b)搜索将如何运作?它会按名称搜索图像,还是必须为图像标记创建另一列,然后按它搜索。

这取决于您的应用程序:如果用户可以为图像添加标签,或者应用程序可以自动执行(也就是类别),那么您可以为用户提供标签搜索的可能性否则不是。因此,您只需按名称搜索:请考虑一个文件可以有任何名称,与图像的实际内容完全无关,因此您最好考虑另一种改进搜索功能的策略。