2015-03-21 4 views
-1

Недавно я опубликовал сообщение о том, как отображать blob из базы данных sqlite, но не получил ответов. После более кропотливых часов :(Наконец-то я нашел ответ, который отображает blobs в представлении изображения, однако он отображает только последний blob в базе данных.Показать все изображения из базы данных sqlite

Есть что-то не так с моим запросом/контуром? Я совершенно неправильно?

класс активности, который отображает блобов

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; 
    } 
} 

EDIT

После прохождения над ответами я теперь добавил сгустки в массив, однако я до сих пор не может отображать их. Это мой текущий код

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); 
} 

ответ

0

То, что вы должны делать это хранение растровых изображений в массив, например:

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: В настоящее время я не могу проверить это, если он работает отлично, но именно так я отобразил массив растровых изображений в сетке в одном из моих предыдущих проектов.

Надеюсь, это поможет.

+0

@miselkingThankyou для вашего ввода, я следил за вашим ответом и реализовал то, что могу, но есть ошибка. Линия imageGridview.setAdapter (адаптер); в деятельности чемпионов. Есть ли способ показать их с помощью массива, но не использовать пользовательский адаптер? как можно проще – Calv

+0

Возьмите его, вы ушли :(im пытается отобразить массив растровых изображений в моем изображении. – Calv

+0

Извините, меня не было вокруг, хм, ImageView может показывать только одно изображение. Таким образом, лучший способ показать изображения для использования адаптера (в моем случае «ImageGridViewAdapter». Да, переменная 'imageGridview' имеет тип« GridView », так же, как вы использовали ее в своем edit.As для обновленного вопроса проблема заключается в том, что' simple_list_item_1' не может отображать изображения , потому что он содержит только «TextView» в своем xml (вы можете найти больше о макетах по умолчанию и как они реализованы [здесь] (https://github.com/android/platform_frameworks_base/tree/master/core/res/res/компоновки). Итак, что вам нужно сделать, это использовать пользовательский адаптер. – miselking

0

На первый взгляд, это то, что вы запрограммировали в своем коде - верните последнее изображение. Код с комментариями:

// 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; 

Если вы хотите получить коллекцию объектов - вернуть коллекцию объектов.

+0

Я понимаю ваш ответ, но не знаю, как закодировать его, чтобы вернуть коллекцию. Извините, я очень новичок в этом, как бы я это сделал? – Calv

Смежные вопросы