如何在Android中将图像插入Sqlite?并获取个人资料

时间:2019-04-12 19:40:15

标签: java android sqlite

我有一个应用程序,它可以从手机图库中获取图像,但是如何将其存储到SQLite数据库中以及如何从SQLite数据库中获取该图像作为用户配置文件。

3 个答案:

答案 0 :(得分:0)

要在SQLite数据库中存储图像,您必须使用“ blob”。

示例:

存储图像

public void insertImg(int id , Bitmap img ) {   

    byte[] data = getBitmapAsByteArray(img); // this is a function

    insertStatement_logo.bindLong(1, id);       
    insertStatement_logo.bindBlob(2, data);

    insertStatement_logo.executeInsert();
    insertStatement_logo.clearBindings() ;
}

 public static byte[] getBitmapAsByteArray(Bitmap bitmap) {
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    bitmap.compress(CompressFormat.PNG, 0, outputStream);       
    return outputStream.toByteArray();
}

检索图像

public Bitmap getImage(int i){

    String qu = "select img  from table where feedid=" + i ;
    Cursor cur = db.rawQuery(qu, null);

    if (cur.moveToFirst()){
        byte[] imgByte = cur.getBlob(0);
        cur.close();
        return BitmapFactory.decodeByteArray(imgByte, 0, imgByte.length);
    }
    if (cur != null && !cur.isClosed()) {
        cur.close();
    }       

    return null;
} 

我建议您遵循tutorial

答案 1 :(得分:0)

您可以将图像存储为斑点

以这种方式创建表格

    "CREATE TABLE TABLE_NAME_HERE (lastname TEXT, gender TEXT, signature BLOB)"

将您的人员类别声明为

    public String Lastname;
    public String Gender;
    public byte[] Signature;

将图像另存为并转换为字节数组

    byte[] signatureByte = //get the image byte array here

添加为db

    SQLiteDatabase db = OpenDb();
    ContentValues values = new ContentValues();

    values.put(KEY_LAST_NAME, person.Lastname);
    values.put(KEY_GENDER, person.Gender);
    values.put(KEY_SIGNATURE, person.Signature);

    db.insert(TABLE_NAME_HERE, null, values);

检索为

    SQLiteDatabase db = OpenDb();
    Cursor cursor = db.rawQuery("SELECT * FROM " + TABLE_NAME_HERE, null);
    if (cursor.moveToFirst()) {
        Person person = new Person();
        person.Lastname = cursor.getString(cursor.getColumnIndex(KEY_LAST_NAME));
        person.Gender = cursor.getString(cursor.getColumnIndex(KEY_GENDER));
        person.Signature = cursor.getBlob(cursor.getColumnIndex(KEY_SIGNATURE));

        return person;
    }

显示为

    signature.setImageBitmap(BitmapFactory.decodeByteArray(person.Signature, 0, person.Signature.length))

或者,您可以将映像存储在应用程序文件夹中,并在数据库中存储对此映像的引用。这样您就可以检索它。

答案 2 :(得分:0)

您应该考虑的第一个问题是是否应将图像保存在数据库中。

通常存储图像不是一个好主意。

对于Android来说,存储和检索大图像的大小可能超过100KB。在这样的大小(可能更大)下,SQLite实际上可以非常有效35% Faster Than The Filesystem(请注意,该文档相对较旧)。

除非您设计了标准Android SDK的替代方案,否则可以检索的图像的绝对最大大小在2MB以下。这是因为CursorWindow(用于返回的行的缓冲区)只有2MB。

简而言之,如果要存储的任何图像接近2MB或2MB或更大,那么您将无法在不使事情复杂化的情况下对其进行检索。 How to use images in Android SQLite that are larger than the limitations of a CursorWindow? 请注意,不建议使用此方法

建议将图像保存到磁盘,并存储路径(或足以唯一标识图像完整路径的路径)。因此,您可以从数据库中检索该路径,然后从提取的路径中检索图像。

How can I insert image in a sqlite database处的答案。演示这种方法以及在数据库中保存较小的图像(100k或更少)(利用35% Faster Than The Filesystem的优势)。