【问题标题】:Display all images from sqlite database显示来自 sqlite 数据库的所有图像
【发布时间】:2015-05-25 03:26:21
【问题描述】:

我最近发表了一篇文章,询问如何显示 sqlite 数据库中的 blob,但没有得到回复。经过更艰苦的几个小时:(我终于找到了一个在图像视图中显示 blob 的答案,但是它只显示数据库中的最后一个 blob。

我的查询/循环有问题吗?还是我完全错了?

显示 blob 的 Activity 类

 public class championsActivity extends Activity {


    private Bitmap champions;
    private myDBHelper db;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_champions);
        ImageView imageView = (ImageView)findViewById(R.id.champ_splash);
        db= new myDBHelper(this);
        champions = db.getChamp_splash();
        imageView.setImageBitmap(champions);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        db.close();
    }

}

DBHelper 类

public class myDBHelper extends SQLiteAssetHelper {

    private static final String DATABASE_NAME = "champions.db";
    private static final int DATABASE_VERSION = 2;

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

    public Bitmap getChamp_splash() {

        Bitmap bitmap = null;
        SQLiteDatabase db = getReadableDatabase();
        db.beginTransaction();
        String sqlTables = "Champions";

        String selectQuery = "SELECT * FROM "+ sqlTables;


        Cursor c = db.rawQuery(selectQuery, null);
        if (c != null) {
            while (c.moveToNext()) {
                byte[] blob = c.getBlob(c.getColumnIndex("champ_splash"));
                bitmap = BitmapFactory.decodeByteArray(blob, 0, blob.length);

            }

        }
        db.setTransactionSuccessful();
        db.endTransaction();
        return bitmap;
    }
}

编辑

查看给出的答案后,我现在已将 blob 添加到数组中,但我仍然无法显示它们。这是我当前的代码

public ArrayList<Bitmap> getChamp_splash() {

    Bitmap bitmap = null;
    SQLiteDatabase db = getReadableDatabase();
    db.beginTransaction();
    String sqlTables = "Champions";
    String selectQuery = "SELECT * FROM "+ sqlTables;

    Cursor c = db.rawQuery(selectQuery, null);
    ArrayList<Bitmap> bitmaps = new ArrayList<Bitmap>();
    if (c != null) {
        while (c.moveToNext()) {
            byte[] blob = c.getBlob(c.getColumnIndex("champ_splash"));
            bitmap = BitmapFactory.decodeByteArray(blob, 0, blob.length);
            bitmaps.add(bitmap);
        }
    }
    db.setTransactionSuccessful();
    db.endTransaction();
    return bitmaps;
}




public class championsActivity extends Activity {

private GridView gridView;
private Cursor champions;
private myDBHelper db;
private ArrayList<Bitmap> champ_splash;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_champions);
    ImageView imageView = (ImageView)findViewById(R.id.champ_splash);
    GridView gridView = (GridView)findViewById(R.id.champion_grid);
    db= new myDBHelper(this);
    champ_splash = db.getChamp_splash();
    imageView.setImageBitmap(champ_splash);
    champions = db.getChampions();
    ListAdapter adapter = new SimpleCursorAdapter(this,
            android.R.layout.simple_list_item_1,
            champions,
            new String[] {"Name"},
            new int[] {android.R.id.text1});
    gridView.setAdapter(adapter);
}

【问题讨论】:

    标签: java android sqlite bitmap blob


    【解决方案1】:

    乍一看,这就是您在代码中编写的内容 - 返回最后一张图片。带有一些 cmets 的代码:

    // create bitmap
    Bitmap bitmap = null;
            SQLiteDatabase db = getReadableDatabase();
            db.beginTransaction();
            String sqlTables = "Champions";
    
            String selectQuery = "SELECT * FROM "+ sqlTables;
    
    
            Cursor c = db.rawQuery(selectQuery, null);
            if (c != null) {
    // go through the result
                while (c.moveToNext()) {
                    byte[] blob = c.getBlob(c.getColumnIndex("champ_splash"));
    // assign each value to bitmap - not very useful as on next iteration - previous bitmap will be overriden
    // on last iteration - set to bitmap last item  - all previous will be deleted
                    bitmap = BitmapFactory.decodeByteArray(blob, 0, blob.length);
    
                } 
    
            } 
            db.setTransactionSuccessful();
            db.endTransaction();
            return bitmap;
    

    如果你想检索对象集合 - 返回对象集合。

    【讨论】:

    • 我理解您的回答,但不知道如何对其进行编码以返回集合。对不起,我是这方面的初学者,我该怎么做?
    【解决方案2】:

    您应该做的是将位图存储到数组中,如下所示:

    public ArrayList<Bitmap> getChamp_splash() {
        ...
        ...
        ArrayList<Bitmap> bitmaps = new ArrayList<Bitmap>();
        if (c != null) {
                while (c.moveToNext()) {
                    byte[] blob = c.getBlob(c.getColumnIndex("champ_splash"));
                    bitmap = BitmapFactory.decodeByteArray(blob, 0, blob.length);
                    bitmaps.add(bitmap);
                }
        }
        ...
        ...
        return bitmaps;
    }
    

    然后在你的championsActivity:

    private ArrayList<Bitmap> champions;
    private GridView imageGridview;
    ...
    ...
    imageGridview = (GridView) findViewById(R.id.my_grid_view);
    champions = db.getChamp_splash();
    if (champions != null) {  // if the bitmaps were found
        ImageGridViewAdapter adapter = new ImageGridViewAdapter(this, bitmaps, columnWidth);   // using custom adapter for showing images
        // columnWidth is just some int value representing image width
        imageGridview.setAdapter(adapter);
    }
    

    还有ImageGridViewAdapter:

    import java.util.ArrayList;
    
    import android.content.Context;
    import android.graphics.Bitmap;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.GridView;
    import android.widget.ImageView;
    
    public class ImageGridViewAdapter extends BaseAdapter {
    
        private Context mContext;
        private ArrayList<Bitmap> bitmaps;
        private int imageWidth;
    
        public ImageGridViewAdapter (Context c, ArrayList<Bitmap> bitm, int width) {
            this.mContext = c;
            this.bitmaps = bitm;
            this.imageWidth = width;
        }
    
        public int getCount() 
        {
            return bitmaps.size();
        }
    
        public Object getItem(int position) {
            return bitmaps.get(position);
        }
    
        public long getItemId(int position) {
            return position;
        }
    
        public View getView(int position, View convertView, ViewGroup parent) {
            ImageView imageView;
            if (convertView == null) 
            {
                imageView = new ImageView(mContext);
            } 
            else 
            {
                imageView = (ImageView) convertView;
            }
    
            imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
            imageView.setLayoutParams(new GridView.LayoutParams(imageWidth, imageWidth));
            imageView.setImageBitmap(bitmaps.get(position));
    
            return imageView;
        }
    
    }
    

    当然,这是把图片显示成GridView,如果你想用不同的方式显示图片,那你就得换个适配器了。

    P.S:我目前无法测试它是否工作正常,但这就是我在以前的一个项目中在网格中显示位图数组的方式。

    希望这会有所帮助。

    【讨论】:

    • @miselking谢谢您的意见,我已经按照您的回答完成了我能做的,但是有一个错误。行 imageGridview.setAdapter(adapter);在冠军活动中。有没有办法使用数组而不是使用自定义适配器来显示它们?尽可能简单
    • 带走吧 :( 我试图在我的 imageView 中显示位图数组
    • 对不起,我不在,嗯,一个 ImageView 只能显示一个图像。因此,显示图像的最佳方式是使用适配器(在我的情况下为 ImageGridViewAdapter。是的,imageGridview 变量是 GridView 类型,就像您在编辑中使用它一样。至于更新的问题,问题是simple_list_item_1 无法显示图像,因为它的 xml 中只包含一个TextView(您可以找到更多关于默认布局以及它们如何实现here。所以,您需要做的是使用自定义适配器
    • 最后,您需要创建一个自定义适配器来显示复杂的东西(如图像),但您不仅限于在GridView 中显示图像,您还可以使用ListView if你想要,你只需要一些小的调整......或者,尝试this问题(它也在问题中得到回答),这可能是显示图像的最简单方法(问题包含所有.xml文件和java文件你需要的)。希望这会有所帮助...
    猜你喜欢
    • 1970-01-01
    • 2016-11-23
    • 2015-09-20
    • 2012-10-16
    • 1970-01-01
    • 1970-01-01
    • 2015-05-03
    • 2016-01-08
    • 2013-05-19
    相关资源
    最近更新 更多