Java 显示sqlite数据库中的所有图像
我最近发了一篇帖子,询问如何显示sqlite数据库中的blob,但没有得到回复。经过几个小时的艰苦工作后:(我终于找到了一个答案,在图像视图中显示blob,但是它只显示数据库中的最后一个blob 我的查询/循环是否有问题?或者我完全错了 显示blob的活动类Java 显示sqlite数据库中的所有图像,java,android,sqlite,bitmap,blob,Java,Android,Sqlite,Bitmap,Blob,我最近发了一篇帖子,询问如何显示sqlite数据库中的blob,但没有得到回复。经过几个小时的艰苦工作后:(我终于找到了一个答案,在图像视图中显示blob,但是它只显示数据库中的最后一个blob 我的查询/循环是否有问题?或者我完全错了 显示blob的活动类 public class championsActivity extends Activity { private Bitmap champions; private myDBHelper db; @Over
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();
}
}
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;
}
}
DBHelper类
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();
}
}
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);
}
public ArrayList getChamp_splash(){
位图=空;
SQLiteDatabase db=getReadableDatabase();
db.beginTransaction();
字符串sqlTables=“Champions”;
String selectQuery=“SELECT*FROM”+sqlTables;
游标c=db.rawQuery(selectQuery,null);
ArrayList位图=新的ArrayList();
如果(c!=null){
while(c.moveToNext()){
字节[]blob=c.getBlob(c.getColumnIndex(“champ_splash”);
位图=BitmapFactory.decodeByteArray(blob,0,blob.length);
位图。添加(位图);
}
}
db.setTransactionSuccessful();
db.endTransaction();
返回位图;
}
公开课冠军活动扩展了活动{
私有GridView GridView;
私营企业;
私人数据库;
私人ArrayList champ_splash;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_);
ImageView ImageView=(ImageView)findViewById(R.id.champ_splash);
GridView GridView=(GridView)findViewById(R.id.champion\u grid);
db=新的myDBHelper(此);
champ_splash=db.getChamp_splash();
设置图像位图(champ_splash);
champions=db.getChampions();
ListAdapter=新的SimpleCorsorAdapter(此,
android.R.layout.simple\u list\u item\u 1,
冠军,
新字符串[]{“名称”},
新的int[]{android.R.id.text1});
setAdapter(适配器);
}
乍一看,这是您在代码中编程的内容-返回最后一幅图像。代码中有一些注释:
// 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;
如果要检索对象集合-返回对象集合。您应该将位图存储到数组中,如下所示:
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;
}
以及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;
}
}
import java.util.ArrayList;
导入android.content.Context;
导入android.graphics.Bitmap;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.BaseAdapter;
导入android.widget.GridView;
导入android.widget.ImageView;
公共类ImageGridViewAdapter扩展了BaseAdapter{
私有上下文;
私有ArrayList位图;
私有整数图像宽度;
公共ImageGridViewAdapter(上下文c、ArrayList bitm、int-width){
this.mContext=c;
this.bitmap=bitm;
这个.imageWidth=宽度;
}
public int getCount()
{
返回位图。size();
}
公共对象getItem(int位置){
返回位图。获取(位置);
}
公共长getItemId(int位置){
返回位置;
}
公共视图getView(int位置、视图转换视图、视图组父视图){
图像视图图像视图;
if(convertView==null)
{
imageView=新的imageView(mContext);
}
其他的
{
imageView=(imageView)convertView;
}
imageView.setScaleType(imageView.ScaleType.CENTER\U裁剪);
setLayoutParams(新的GridView.LayoutParams(imageWidth,imageWidth));
setImageBitmap(位图.get(位置));
返回图像视图;
}
}
当然,这是将图像显示到网格视图中
,如果要以不同方式显示图像,则必须更改适配器
附言:如果它工作正常,我目前无法测试它,但在我以前的一个项目中,我就是这样在网格中显示位图数组的
希望这能有所帮助。我理解你的答案,但不知道如何编写代码返回集合。很抱歉,我对这方面非常熟悉,我该如何做?@miselkingthank谢谢你的输入,我已经按照你的答案完成并实现了我所能实现的,但是出现了一个错误。行imageGridview.setAdapter(adapter);在champions活动中。有没有一种方法可以使用数组而不是自定义适配器来显示它们?尽可能简单地说就像你所做的那样:(我试图在我的ImageView中显示位图数组对不起,我不在,嗯,ImageView只能显示一个图像。因此,显示图像的最佳方法是使用适配器(在我的例子中,
ImageGridViewAdapter
。是的,imageGridview
变量是GridView
类型,就像您在编辑中使用的那样。至于更新的问题,问题是simple\u list\u item\u 1
无法显示图像,因为它的xml中只包含TextView
)(您可以找到有关默认布局及其实现方式的更多信息。因此,您需要做的是使用自定义适配器。最后,您需要创建一个自定义适配器来显示复杂的内容(如图像),但您不局限于在GridView
中显示图像,如果需要,您还可以使用ListView
,您只需要做一些小的调整……或者,试试这个问题(问题中也有答案),这可能是显示图像的最简单方法(问题包含您需要的所有.xml文件和java文件).希望这有帮助。。。