简体   繁体   English

如何在Android的SqLite数据库中存储和检索图像?

[英]How to store and retrive images in SqLite database in Android?

I am new to Android and English sorry about that. 我是Android新手,对此感到英语抱歉。 I created a table that has image, some string expression. 我创建了一个具有图像和一些字符串表达式的表。 I want to store this image as blob in SQLite because I dont know another method for storing a image. 我想将此图像存储为SQLite中的Blob,因为我不知道另一种存储图像的方法。 anyway I want to display this image in imageView but when I clicked buttonNew the activity closed. 无论如何,我想在imageView中显示此图像,但是当我单击buttonNew时,活动已关闭。 I could not understand what's the issue ? 我不明白是什么问题? I hope somebody help me or recomend me another method for storing a image. 我希望有人帮我或推荐给我另一种存储图像的方法。 thanks for reading 谢谢阅读

Database.java file Database.java文件

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Log;
import android.widget.Toast;

import org.apache.http.util.ByteArrayBuffer;

import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

public class Database {

    DatabaseHelper databaseHelper;
    private Context context;
    SQLiteDatabase sqLiteDatabase;


    public Database(Context context){
        databaseHelper = new DatabaseHelper(context);
    }

    static class  DatabaseHelper extends SQLiteOpenHelper{


        private static final String DATABASE_NAME = "alesuygulama.db";
        public static final String TABLE_NAME = "alesuygulamatablo";
        private static final int DATABASE_VERSION = 2;

        //tablo kolonları
        private static final String ID = "_id";
        private static final String YIL = "yil";
        private static final String MEVSIM = "mevsim";
        private static final String KISIM = "kisim";
        public static final String SORU = "soru";


        private static final String CREATE_TABLE = "CREATE TABLE " + TABLE_NAME
                /*+ " ( " + ID + " INTEGER PRIMARY KEY AUTOINCREMENT, "
                + YIL + " TEXT NOT NULL, "
                + MEVSIM + " TEXT NOT NULL, "
                + KISIM +" TEXT NOT NULL, "*/
                + " ( " +SORU + " BLOB );";

        private static final String DROP_TABLE = "DROP TABLE IF EXISTS " + TABLE_NAME;


        private Context context;

        public DatabaseHelper(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }

        @Override
        public void onCreate(SQLiteDatabase db) {
            try {
                db.execSQL(CREATE_TABLE);
            } catch (SQLException e) {
                System.out.println("Veri tabanı oluşturulamadı.");
                e.printStackTrace();
            }

        }

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            try {
                db.execSQL(DROP_TABLE);
                onCreate(db);
            } catch (SQLException e) {
                System.out.println("Veri tabanı yenilenemedi.");
                e.printStackTrace();
            }
        }
    }
}

activity file 活动档案

import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Handler;
import android.os.SystemClock;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.os.SystemClock;
import android.widget.Toast;

import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;


public class ActivitySinav extends ActionBarActivity implements View.OnClickListener {




    Button buttonOld;
    Button buttonNew;
    ImageView imageView;


    SQLiteDatabase sqLiteDatabase;
    Database.DatabaseHelper databaseHelper;
    Cursor c = null;
    byte[] img = null;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_sinav);


        buttonOld = (Button)findViewById(R.id.buttonOld);
        buttonNew = (Button)findViewById(R.id.buttonNew);
        imageView = (ImageView)findViewById(R.id.imageView);
        buttonOld.setOnClickListener(this);
        buttonNew.setOnClickListener(this);
        databaseHelper = new Database.DatabaseHelper(getApplicationContext());

        Bitmap b = BitmapFactory.decodeResource(getResources(), R.drawable.resim1);
        ByteArrayOutputStream bos = new ByteArrayOutputStream();

        b.compress(Bitmap.CompressFormat.PNG, 100, bos);

        img = bos.toByteArray();
        sqLiteDatabase = databaseHelper.getWritableDatabase();
    }

    @Override
    public void onClick(View v) {

        if(buttonOld == v)
        {
            ContentValues values = new ContentValues();
            values.put("SORU", img);
            sqLiteDatabase.insert(databaseHelper.TABLE_NAME, null, values);
            Toast.makeText(this, "inserted successfully", Toast.LENGTH_SHORT).show();
        }
        else if(buttonNew == v){
            String[] col = {"SORU"};
            c = sqLiteDatabase.query(databaseHelper.TABLE_NAME, col, null, null, null, null,null);
            if(c != null){
                c.moveToFirst();
                do{
                    img = c.getBlob(c.getColumnIndex("SORU"));
                }while(c.moveToNext());

                Bitmap b1 = BitmapFactory.decodeByteArray(img, 0, img.length);
                imageView.setImageBitmap(b1);
                Toast.makeText(this, "Retrieve successfully", Toast.LENGTH_SHORT).show();
            }

        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_activity_sinav, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }


}

and layout file 和布局文件

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="1dp"
    android:paddingLeft="1dp"
    android:paddingRight="1dp"
    android:paddingTop="1dp"
    tools:context="com.example.emri.alesuygulama.ActivitySinav">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textAppearance="?android:attr/textAppearanceLarge"
        android:text="00:00:00"
        android:id="@+id/timerValue"
        android:layout_marginLeft="5dp" />

    <ImageView
        android:layout_width="370dp"
        android:layout_height="320dp"
        android:id="@+id/imageView"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="25dp"
        android:layout_marginRight="5dp"
        android:layout_marginLeft="7dp" />

    <Button
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:text="A"
        android:id="@+id/buttonA"
        android:layout_below="@+id/imageView"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginLeft="15dp" />

    <Button
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:text="B"
        android:id="@+id/buttonB"
        android:layout_alignBottom="@+id/buttonA"
        android:layout_toRightOf="@+id/buttonA"
        android:layout_toEndOf="@+id/buttonA"
        android:layout_marginLeft="25dp" />

    <Button
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:text="C"
        android:id="@+id/buttonC"
        android:layout_alignBottom="@+id/buttonB"
        android:layout_toRightOf="@+id/buttonB"
        android:layout_toEndOf="@+id/buttonB"
        android:layout_marginLeft="25dp" />

    <Button
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:text="D"
        android:id="@+id/buttonD"
        android:layout_alignBottom="@+id/buttonC"
        android:layout_toRightOf="@+id/buttonC"
        android:layout_toEndOf="@+id/buttonC"
        android:layout_marginLeft="25dp" />

    <Button
        android:layout_width="50dp"
        android:layout_height="50dp"
        android:text="E"
        android:id="@+id/buttonE"
        android:layout_below="@+id/imageView"
        android:layout_alignRight="@+id/imageView"
        android:layout_alignEnd="@+id/imageView"
        android:layout_marginLeft="25dp"
        android:layout_marginRight="15dp" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Önceki Soru"
        android:id="@+id/buttonOld"
        android:layout_below="@+id/buttonA"
        android:layout_alignLeft="@+id/imageView"
        android:layout_alignStart="@+id/imageView"
        android:layout_marginTop="25dp"
        android:layout_marginLeft="35dp" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Sonraki soru"
        android:id="@+id/buttonNew"
        android:layout_alignBottom="@+id/buttonOld"
        android:layout_toRightOf="@+id/buttonC"
        android:layout_toEndOf="@+id/buttonC"
        android:layout_marginTop="25dp"
        android:layout_marginRight="35dp" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Pas geç"
        android:id="@+id/buttonEmpty"
        android:layout_below="@+id/buttonOld"
        android:layout_centerHorizontal="true" />

    <Button
        android:layout_width="150dp"
        android:layout_height="wrap_content"
        android:text="Sınavı Bitir"
        android:id="@+id/buttonEnd"
        android:layout_below="@+id/buttonEmpty"
        android:layout_centerHorizontal="true" />

</RelativeLayout>

您可以只存储图像路径,然后从表中读取路径并检索图像。

There are three way to save images to local db: 1-save blob of image. 有三种将图像保存到本地数据库的方法:1-保存图像斑点。 2-save image to directory and then save directory path to DB. 2将映像保存到目录,然后将目录路径保存到DB。 3-save image as base64 in db. 3将图像另存为db中的base64。

But options 1 and 2 are mostly adopted by developer.so just look ahead over these options. 但是选项1和2大部分是由开发人员采用的,因此请先了解这些选项。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM