尝试将图像插入Sqlite数据库时如何使用Blob?

时间:2017-03-13 19:13:27

标签: java android database sqlite android-layout

我是Android开发人员的新手。 我正在尝试使用SQlite创建Android应用程序。我在Blob中插入图像时遇到问题。文本很容易插入,但问题在于图像。我知道我需要使用Blob,但问题是,在哪里使用它?我需要在布局中使用Imageview吗? 我需要clic to image按钮,然后从SD卡或移动设备插入图像,然后将其保存到带有文本的Sqlite数据库中。之后,从Sqlite数据库中恢复。

感谢您的关注和帮助。

有我的代码: MainActivity

public class MainActivity extends AppCompatActivity {
EditText etName,etRoll,etAddress,etBranch,etEmail,etImage;
Button btnSubmit,btngetdata,btndroptable;
DatabaseHelpher helpher;
List<DatabaseModel> dbList;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    dbList= new ArrayList<DatabaseModel>();
    etName = (EditText)findViewById(R.id.etName);
    etRoll = (EditText)findViewById(R.id.etRoll);
    etAddress =(EditText)findViewById(R.id.etAddress);
    etBranch = (EditText)findViewById(R.id.etBranch);
    etEmail = (EditText)findViewById(R.id.etEmail);
    etImage = (Image)findViewById(R.id.image);      // ????
    btnSubmit  =(Button)findViewById(R.id.btnSubmit);
    btngetdata =(Button)findViewById(R.id.btngetdata);

    btngetdata.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            startActivity(new Intent(MainActivity.this, SecondActivity.class));

           // startActivity(new Intent(MainActivity.this, DetailsActivity.class));

        }
    });

    btnSubmit.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            String name=etName.getText().toString();
            String email=etEmail.getText().toString();
            String roll=etRoll.getText().toString();
            String address=etAddress.getText().toString();
            String branch=etBranch.getText().toString();
            Blob image=etImage

        if(name.equals("") || email.equals("") || roll.equals("") ||address.equals("")||branch.equals("")){
            Toast.makeText(MainActivity.this,"Please fill all the fields",Toast.LENGTH_LONG).show();
        }else {
            helpher = new DatabaseHelpher(MainActivity.this);
            helpher.insertIntoDB(name, email, roll, address, branch, image);
        }
            etName.setText("");
            etRoll.setText("");
            etAddress.setText("");
            etBranch.setText("");
            etEmail.setText("");


            Toast.makeText(MainActivity.this, "insert value", Toast.LENGTH_LONG);

        }
    });

}}

DatabaseModel.java:

 public class DatabaseModel {
    private String name;
    private String roll;
    private String address;
    private String branch;
    private String email;
    private String image;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getRoll() {
        return roll;
    }

    public void setRoll(String roll) {
        this.roll = roll;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getBranch() {
        return branch;
    }

    public void setBranch(String branch) {
        this.branch = branch;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getImage() {
        return image;
    }

    public void setImage (byte[] image) {
        this.image = image;
    }
}

DatabaseHelper.java:

 public class DatabaseHelpher extends SQLiteOpenHelper {
    private static final String DATABASE_NAME="student";
    private static final int DATABASE_VERSION = 1;
    private static final String STUDENT_TABLE = "stureg";
    private static final String STU_TABLE = "create table "+STUDENT_TABLE +"(name TEXT,email TEXT primary key,roll TEXT,address TEXT,branch TEXT,,image BLOB)";

    Context context;

    public DatabaseHelpher(final Context context) {
        super(context, Environment.getExternalStorageDirectory()
                + File.separator + DATABASE_NAME, null, DATABASE_VERSION);
        this.context = context;
    }

    @Override
    public void onCreate(SQLiteDatabase db) {

        db.execSQL(STU_TABLE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

        db.execSQL("DROP TABLE IF EXISTS " + STUDENT_TABLE);

        // Create tables again
        onCreate(db);
    }

    public void insertIntoDB(String name,String email,String roll,String address,String branch,byte[]image_data){
        Log.d("insert", "before insert");

        // 1. get reference to writable DB
        SQLiteDatabase db = this.getWritableDatabase();

        // 2. create ContentValues to add key "column"/value
        ContentValues values = new ContentValues();
        values.put("name", name);
        values.put("email", email);
        values.put("roll", roll);
        values.put("address", address);
        values.put("branch", branch);
        values.put("image", image_data);

        // 3. insert
        db.insert(STUDENT_TABLE, null, values);
        // 4. close
        db.close();
        Toast.makeText(context, "insert value", Toast.LENGTH_LONG);
        Log.i("insert into DB", "After insert");



    }


    public List<DatabaseModel> getDataFromDB(){
        List<DatabaseModel> modelList = new ArrayList<DatabaseModel>();
        String query = "select * from "+STUDENT_TABLE;

        SQLiteDatabase db = this.getWritableDatabase();
        Cursor cursor = db.rawQuery(query,null);
        if (cursor.moveToFirst()){
            do {
                DatabaseModel model = new DatabaseModel();
                model.setName(cursor.getString(0));
                model.setEmail(cursor.getString(1));
                model.setRoll(cursor.getString(2));
                model.setAddress(cursor.getString(3));
                model.setBranch(cursor.getString(4));
                model.setImage(cursor.getBlob(5));  //Add byte paramter in your DatabaseModel
                modelList.add(model);
            }while (cursor.moveToNext());
        }


        Log.d("student data", modelList.toString());


        return modelList;
    }



    public void deleteARow(String email){
        SQLiteDatabase db= this.getWritableDatabase();
        db.delete(STUDENT_TABLE, "email" + " = ?", new String[] { email });
        db.close();
    }
}

activity_main.layout:

 <LinearLayout 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"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical">
    <android.support.design.widget.AppBarLayout
        android:id="@+id/appbar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
            app:layout_scrollFlags="scroll|enterAlways" />

    </android.support.design.widget.AppBarLayout>

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical" >

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="horizontal">
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Enter Email"/>

                <EditText
                    android:id="@+id/etEmail"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"/>

            </LinearLayout>

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="horizontal">

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Enter Branch"/>
                <EditText
                    android:id="@+id/etBranch"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"/>

            </LinearLayout>

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="horizontal">
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Enter Address"/>
                <EditText
                    android:id="@+id/etAddress"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"/>

            </LinearLayout>

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="horizontal">
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Enter Roll"/>
                <EditText
                    android:id="@+id/etRoll"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"/>

            </LinearLayout>

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="horizontal">
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Enter Name"/>
                <EditText
                    android:id="@+id/etName"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"/>

            </LinearLayout>

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:orientation="horizontal">
                <Button
                    android:id="@+id/btnSubmit"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:text="uložit do databáze"
                    android:textColor="#ffffff"
                    android:background="@color/colorPrimary"/>

            </LinearLayout>

            <LinearLayout
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_marginTop="10dp"
                android:orientation="horizontal">

                <Button
                    android:id="@+id/btngetdata"
                    android:layout_width="match_parent"
                    android:layout_height="match_parent"
                    android:text="Zobrazit seznam rumů"
                    android:textColor="#ffffff"
                    android:background="@color/colorPrimary"/>

            </LinearLayout>

        </LinearLayout>
    </ScrollView>


</LinearLayout>

Activity_details.layout

<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<android.support.design.widget.AppBarLayout
    android:id="@+id/appbar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar">

    <android.support.v7.widget.Toolbar
        android:id="@+id/toolbar"
        android:layout_width="match_parent"
        android:layout_height="?attr/actionBarSize"
        android:background="?attr/colorPrimary"
        app:popupTheme="@style/ThemeOverlay.AppCompat.Light"
        app:layout_scrollFlags="scroll|enterAlways" />
</android.support.design.widget.AppBarLayout>

<TextView
    android:id="@+id/name"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="name"
    android:paddingTop="15dp"
    android:paddingLeft="20dp"
    android:textSize="36sp" />

<TextView
    android:id="@+id/roll"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Roll"/>
<TextView
    android:id="@+id/address"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Address"/>
<TextView
    android:id="@+id/branch"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Branch"/>
<TextView
    android:id="@+id/email"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:text="Email"/>
<ImageView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/image"/>
</LinearLayout>

在哪里添加图片视图?当我尝试进入布局时,我不知道,在哪里将异常代码转换成java类? 我需要帮助,现在在哪里可以找到它。我需要完成我的代码,因为这是我的功课。请有人帮助我。

谢谢

4 个答案:

答案 0 :(得分:0)

将图像保存在数据库中并不是一种好习惯(保存在文件夹中更漂亮)。

但是...... 如何在byte []

中查看转换器图像
image                        = (ImageView)findViewById(R.id.qrcode);
Bitmap bitmap                = ((BitmapDrawable)image.getDrawable()).getBitmap();
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG, 90, stream);
byte[] image=stream.toByteArray();

然后在dataBase中保存图像byte []。

答案 1 :(得分:0)

对于@Peterr

这里有什么问题?

btnSubmit.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
        String name=etName.getText().toString();
        String email=etEmail.getText().toString();
        String roll=etRoll.getText().toString();
        String address=etAddress.getText().toString();
        String branch=etBranch.getText().toString();
        image = (ImageView)findViewById(R.id.image);   //error on image????
        Bitmap bitmap = ((BitmapDrawable)image.getDrawable()).getBitmap(); //error on image ????
        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG, 90, stream);
        byte[] image=stream.toByteArray();


    if(name.equals("") || email.equals("") || roll.equals("") ||address.equals("")||branch.equals("")){
        Toast.makeText(MainActivity.this,"Please fill all the fields",Toast.LENGTH_LONG).show();
    }else {
        helpher = new DatabaseHelpher(MainActivity.this);
        helpher.insertIntoDB(name, email, roll, address, branch, imageByteArray); //red is ImageByteArray ????
    }
        etName.setText("");
        etRoll.setText("");
        etAddress.setText("");
        etBranch.setText("");
        etEmail.setText("");


        Toast.makeText(MainActivity.this, "insert value", Toast.LENGTH_LONG);

    }
});

答案 2 :(得分:0)

ImageView image = (ImageView)findViewById(R.id.image); 

以XML布局指示您的ImageView组件

在你的第二行活动中,你正在声明图像EditText,这不是EditText,这是ImageView。

答案 3 :(得分:0)

步骤:

  1. 从图像视图中获取图像。
  2. 将图像转换为字节数组。
  3. 将字节数组作为数据/参数传递给数据库