2014-07-20 6 views
0

У меня есть обработчик базы данных, хотя я не слишком хорошо знаком с SQLite. Я не совсем уверен, где хранится база данных и где должны храниться изображения, которые я хочу сохранить в ней.Android Studio SQLite вставить изображение из базы данных

У меня 4 изображения. И хотите применить случайное захват изображения из базы данных и поместить его в мой макет сетки (который я уже заполнял кнопками).

Вот XML Сетка:

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

Кто-нибудь ум объяснить это мне?

Edit: Моя попытка с помощью 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; 
    } 
} 

ответ

2

Если у вас есть ровно 4 изображения, которые вы можете поместить их все в res/drawable каталог, то вы можете обратиться к их как R.drawable.image1, R.drawable.image2 и т. д. (при условии, что файлы имеют имя image1.png, image2.png и т. д.), и нет необходимости хранить их в базе данных. Я пропустил вашу мысль?

+0

Привет, Алекс, его нужно произвольно вытаскивать из базы данных, поэтому я могу просто добавить больше изображений, и он применит их. –

+0

Если только вы, а не пользователь, добавляющий изображения, то вы все равно можете добавить их в папку с возможностью перемещения и сохраняйте только свои индексы в своей базе данных (например, 1 для drawable1 и т. д.). Если ваш пользователь может добавить больше изображений, вы должны пойти с другими ответами на свой вопрос, те, которые объясняют, как бороться с blobs. –

+0

Как говорит Алекс, если изображения не являются динамическими, его решение на сегодняшний день является лучшим (лучше, чем мое, ниже) , Нет необходимости вообще задействовать БД. Извлеките их случайным образом из папки drawables. Просто создайте массив с идентификаторами ресурсов из 4 изображений и произвольно проиндексируйте его. –

1

Здесь вы запрашиваете значительное количество кода.

Если вы абсолютно должны поместить изображения в базу данных, вам нужно будет использовать blob.

Сначала вам нужно сохранить каждое изображение как blob в строке в db.

Как только каждый кадр находится в своей строке, вам нужно будет запросить нужную строку. Для этого вам придется сопоставить случайное число с первичным ключом одной из строк.

Далее вы получите query базу данных для получения Cursor для строки, содержащей изображение.

Наконец, вы прочитаете blob, используйте BitmapFactory для преобразования байтов в изображение и установки изображения в ImageView.

... но позвольте мне поспешить добавить, что все это, вероятно, плохая идея! Помещение чего-то размера изображения в базу данных SQLite, вероятно, приведет к довольно медленному поведению. Лучше сохранять изображения в виде файлов изображений и извлекать их из файловой системы.

Если вы не получаете изображения динамически, вы можете включить их в свою программу в качестве активов, а затем все это станет очень простым. Просто откройте файл активов и используйте BitmapFactory, чтобы преобразовать его в изображение.

+0

Привет, Блейк, я очень новичок во всем этом и не имею Идеи, где даже начать. Мне был назначен этот проект, и после всего, что я прочитал, я, вероятно, советую отказаться от этого метода. На данный момент я действительно не знаю, с чего начать с Blobs. В данный момент я следую этому руководству, но это действительно не объясняет, что я делаю. Я также не понимаю ссылки, которые она делает, ссылаясь на них до их создания: http://androidsurya.blogspot.co.uk/2012/11/insert-and-retrieve-image-from-sqlite.html –

+0

Получил это. Пожалуйста, рассмотрите предложение @Alex выше. Причина, по которой трудно найти пример, - это, как правило, плохая идея. Если ресурсы действительно не сработают, вам придется немного почитать. Blobs не так уж сложно: просто большие байт-массивы, которые вы храните в БД. –

+0

Эй, Блейк, пока я тренируюсь с Blobs, я прошел этот учебник и начал использовать Документацию, указанную выше. Я изменил свой оригинальный пост с изменениями, однако я возвращаю ошибки в DBhelper.java. http://puu.sh/ak6yv/a0cd42f31e.png Я также не могу найти библиотеку для getBitmap, хотя, я добавил этот импорт: import android.view.TextureView; , который я нашел здесь: http://developer.android.com/reference/android/view/TextureView.html, Извините за то, что выбрал свой мозг :), просто пытаясь сломать каждую часть во что-то, что я могу понять! –

0

Ваш bd находится здесь: data/data/package_name/databases, это внутренний каталог для вашего приложения.

SQLite имеет вид Blob для хранения сериализованных объектов, но я думаю, что, как и любой другой банк, является наиболее подходящим для вас в ваших изображений в Android мы в некоторые варианты directory, такие как: assets, raw или зависит от вашего сценария.

Это фрагмент кода из приложения я разработал немного времени, так как у меня было очень мало фотографий, положить assetsfolder, и использовал UniversalImagerLoager LIB для управления загрузкой изображений в Соображениях

@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, ваш nome_banco.db создается в этой папке data/data/package_name/databases/nome_banco.db, если вы установите на AVD вы можете перейти в этот каталог по DDMS.

Что касается изображений, например: если у вас есть 4 изображения «image1, image2, image3 и image4» и размещены в папке Assets вашего проекта, вы можете сохранить имена изображений в db и когда шоу:

// To load image 
    String Uri = "assets://images/image1"; 
    ImageLoader.getInstance().displayImage(Uri, folderView, options); 

, если вы не хотите использовать эту LIB, вы можете искать, загружать изображения с папки активов, и вы найдете достаточно много.

+0

Привет Андре, я немного запутался на пути, поскольку я не могу найти его в пути к проектам? http://puu.sh/ak13e/9c2e152786.png Я не уверен, ищу ли я в правильном/неправильном месте. Я тоже не вижу этого в Android Studio. –

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