Android Studio SQLite从数据库插入图像

时间:2014-07-20 22:23:13

标签: android sqlite

我准备好了数据库处理程序,虽然我对SQLite不太熟悉。我不确定数据库的存储位置以及我希望存储在其中的图像应该在哪里。

我有4张图片。并希望从数据库中应用随机图像并将其放入我的网格布局中(到目前为止,我已经填充了按钮)。

这是XML Grid:

 <GridLayout
      xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:columnCount="1"
      android:paddingTop="100dp"
      android:layout_gravity="center_horizontal">



      <LinearLayout
           android:layout_width="match_parent"
           android:layout_height="wrap_content" android:orientation="horizontal">
           <Space
                 android:layout_width="wrap_content"
                 android:layout_height="match_parent"
                 android:layout_weight="1" />
           <Button
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:text="Button 1" />
           <Space
                 android:layout_width="wrap_content"
                 android:layout_height="match_parent"
                 android:layout_weight="1" />
           <Button
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_gravity="start"
                 android:text="Button 2" />
           <Space
                 android:layout_width="wrap_content"
                 android:layout_height="match_parent"
                 android:layout_weight="1" />
       </LinearLayout>

       <LinearLayout
           android:layout_width="match_parent"
           android:layout_height="wrap_content"
           android:orientation="horizontal" >
           <Space
                 android:layout_width="wrap_content"
                 android:layout_height="match_parent"
                 android:layout_weight="1" />
           <Button
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:text="Button 3" />
           <Space
                 android:layout_width="wrap_content"
                 android:layout_height="match_parent"
                 android:layout_weight="1" />
           <Button
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_gravity="start"
                 android:text="Button 4" />
           <Space
                 android:layout_width="wrap_content"
                 android:layout_height="match_parent"
                 android:layout_weight="1" />
      </LinearLayout>
 </GridLayout>

有人会介意向我解释这个吗?

编辑:我尝试使用BLOBS:

InsertandRetriveBlobData.java:
package com.example.brad.myapplication;

import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.widget.ImageView;
import android.widget.TextView;

/**
 * Created by Brad on 20/07/2014.
 */


public class InsertandRetriveBlobData extends MyActivity {
    private DBhelper DbHelper;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my);
        DbHelper = new DBhelper(this);
        Car car_One = new Car(BitmapFactory.decodeResource(
                getResources(), R.drawable.photo), 1);
        DbHelper.open();
        DbHelper.insertCarDetails(car_One);
        DbHelper.close();
        car_One = null;
        DbHelper.open();
        car_One = DbHelper.retriveCarDetails();
        DbHelper.close();

        ImageView carphoto = (ImageView) findViewById(R.id.photo);
        carphoto.setImageBitmap(car_One.getBitmap());

    }
}

DBhelper.java:

package com.example.brad.myapplication;

/**
 * Created by Brad on 21/07/2014.
 */

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;

public class DBhelper {
    public static final String CAR_ID = "id";
    public static final String CAR_PHOTO = "photo";

    private DatabaseHelper mDbHelper;
    private SQLiteDatabase mDb;

    private static final String DATABASE_NAME = "CarDB.db";
    private static final int DATABASE_VERSION = 1;

    private static final String CARS_TABLE = "Cars";

    private static final String CREATE_CARS_TABLE = "create table "
            + CARS_TABLE + " (" + CAR_ID
            + " integer primary key autoincrement, " + CAR_PHOTO
            + " blob not null);";

    private final Context mCtx;

    private static class DatabaseHelper extends SQLiteOpenHelper {
        DatabaseHelper(Context context) {
            super(context, DATABASE_NAME, null, DATABASE_VERSION);
        }

        public void onCreate(SQLiteDatabase db) {
            db.execSQL(CREATE_CARS_TABLE);
        }

        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            db.execSQL("DROP TABLE IF EXISTS " + CARS_TABLE);
            onCreate(db);
        }
    }

    public void Reset() {
        mDbHelper.onUpgrade(this.mDb, 1, 1);
    }

    public DBhelper(Context ctx) {
        mCtx = ctx;
        mDbHelper = new DatabaseHelper(mCtx);
    }

    public DBhelper open() throws SQLException {
        mDb = mDbHelper.getWritableDatabase();
        return this;
    }

    public void close() {
        mDbHelper.close();
    }

    public void insertCarDetails(Car car) {
        ContentValues cv = new ContentValues();
        cv.put(CAR_PHOTO, Utility.getBytes(car.getBitmap()));
        mDb.insert(CARS_TABLE, null, cv);
    }

    public Car retriveCarDetails() throws SQLException {
        Cursor cur = mDb.query(true, CARS_TABLE, new String[] { CAR_PHOTO}, null, null, null, null, null, null);
        if (cur.moveToFirst()) {
            byte[] blob = cur.getBlob(cur.getColumnIndex(CAR_PHOTO));
            cur.close();
            return new Car(Utility.getPhoto(blob));
        }
        cur.close();
        return null;
    }
}

3 个答案:

答案 0 :(得分:2)

如果您有4个图像,则可以将它们全部放入res/drawable目录中,然后您可以将它们称为R.drawable.image1, R.drawable.image2等(如果文件名为image1.png, image2.png等),则不然后需要将它们存储在数据库中。我错过了你的观点吗?

答案 1 :(得分:1)

你在这里要求大量的代码。

如果绝对必须将图像放入数据库,则需要使用blob

首先必须将每个图像保存为db中的一行blob。

每个blob都在自己的行中,您将不得不查询所需的行。为此,您必须从随机数映射到其中一行的主键。

接下来,您将query数据库获取包含图像的行的Cursor

最后,您将阅读blob,使用BitmapFactory将字节转换为图像并将图像安装在ImageView中。

...但是让我赶紧补充一点,这可能是一个坏主意!将图像大小的内容放入SQLite数据库可能会导致行为相当缓慢。最好将图像保存为图像文件,并从文件系统中检索它们。

如果您没有动态获取图像,可以将它们作为资源包含在程序中,然后整个过程变得非常简单。只需打开资产文件并使用BitmapFactory将其转换为图像。

答案 2 :(得分:0)

你的bd在这里:data/data/package_name/databases,这是你申请的内部目录。

SQLiteBlob来存储序列化对象,但我认为与其他银行一样,最适合您的图片,在Android中我们有一些选项{{1 },例如:directoryassetsraw取决于您的情况。

这是我开发了一段时间的应用程序的代码片段,因为我的图片非常少,放了directory internal assets,并使用folder lib来管理将图像加载到视图

UniversalImagerLoager

向导无法访问 @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if(convertView == null){ holder = new ViewHolder(); convertView = inflater.inflate(R.layout.horizontal_row, parent, false); holder.mTextView = (TextView) convertView.findViewById(R.id.mTextView); holder.mImageViewArrow = (ImageView) convertView.findViewById(R.horizontal_row_id.selected); holder.mImageViewFolder = (ImageView) convertView.findViewById(R.horizontal_row_id.folder); convertView.setTag(holder); } else{ holder = (ViewHolder) convertView.getTag(); } if(pontosMarcados.contains(getItem(position))){ holder.mImageViewArrow.setVisibility(View.VISIBLE); }else { holder.mImageViewArrow.setVisibility(View.GONE); } holder.mTextView.setText(mCategoriaWithListItens.getPontos().get(position).getName().toUpperCase()); setFolder(holder.mImageViewFolder, mCategoriaWithListItens.getPontos().get(position).getOneFotos(0)); return convertView; } private void setFolder(ImageView folderView, Foto foto){ // To load image String Uri = "assets://images"; ImageLoader.getInstance().displayImage(Uri+foto.getUrl(), folderView, options); } ,当您创建类数据库的第一个实例时,扩展internal directory的实例,在该文件夹中创建SQLiteOpenHelper {{1}如果您在 AVD 上安装,则可以通过 DDMS 导航到该目录。

关于图像,例如:如果您有4张图片“image1,image2,image3和image4”,并放置在项目的nome_banco.db文件夹中,则可以在db中保存图像的名称,当show:

data/data/package_name/databases/nome_banco.db

如果你不选择使用这个库,你可以搜索,从资源文件夹加载图像,你会发现很多。