Изображение в базу данных из отрисовки - PullRequest
0 голосов
/ 07 марта 2012

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

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

Вот мой код

 package com.ondrovic.boombozzpassport;

 import java.io.ByteArrayOutputStream;
 import java.io.IOException;

 import android.content.ContentValues;
 import android.content.Context;
 import android.database.sqlite.SQLiteDatabase;
 import android.database.sqlite.SQLiteOpenHelper;
 import android.graphics.Bitmap;
 import android.graphics.Bitmap.CompressFormat;
 import android.graphics.BitmapFactory;
 import android.provider.BaseColumns;
 import android.util.Log;

 public class Database extends SQLiteOpenHelper implements BaseColumns {
     private final static String DB_NAME = "boombozz.db";
     private final static int DB_VERSION = 1;
     static final String TABLE_BEERS = "beers";
     static final String COL_NAME = "name";
     static final String COL_BREWER = "brewer";
     static final String COL_ABV = "abv";
     static final String COL_RATE = "rating";
     static final String COL_BDESC = "breifdescription";
     static final String COL_FDESC = "fulldescription";
     static final String COL_TYPE = "type";
     static final String COL_PIC = "picture";

     private Context mContext;
     private Bitmap picture = null;

 public Database(Context context) {
    super(context, DB_NAME, null, DB_VERSION);
}

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL("CREATE TABLE beers (" + "_id INTEGER PRIMARY KEY, "
            + "name TEXT, " + "brewer TEXT, " + "abv REAL, "
            + "rating REAL, " + "breifdescription TEXT, "
            + "fulldescription TEXT, " + "type TEXT, " + "picture BLOB);");

    addBeer(db, "NAME 1", "BREWER 1", "TYPE 1", "BDESC 1", "FDESC 1", 0, 0, R.drawable.beer1);

}

private void addBeer(SQLiteDatabase db, String name, String brewer,
        String type, String bdesc, String fdesc, int abv, int rate, int image) {
    final ContentValues cv = new ContentValues();
    cv.put(COL_NAME, name);
    cv.put(COL_BREWER, brewer);
    cv.put(COL_TYPE, type);
    cv.put(COL_BDESC, bdesc);
    cv.put(COL_FDESC, fdesc);
    cv.put(COL_ABV, abv);
    cv.put(COL_RATE, rate);


    final Bitmap bitmap = BitmapFactory.decodeResource(
            mContext.getResources(), image);
    writeBitmap(cv, COL_PIC, bitmap);

    db.insert(TABLE_BEERS, null, cv);
}

static void writeBitmap(ContentValues cv, String name, Bitmap image) {
    if (image != null) {
        try {
            int size = image.getWidth() * image.getHeight() * 2;
            ByteArrayOutputStream out = new ByteArrayOutputStream(size);

            image.compress(CompressFormat.PNG, 100, out);
            out.flush();
            out.close();

            cv.put(name, out.toByteArray());

        } catch (IOException e) {

        }
    }
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    Log.w("onUpgrade", "Upgrading database from version: " + oldVersion
            + " to version: " + newVersion);
    db.execSQL("DROP TABLE IF EXISTS beers");
}
}

Ответы [ 2 ]

1 голос
/ 07 марта 2012

Вы загружаете эти изображения? Если да, сохраните его на SDCard / Phone Memory в соответствии с рекомендациями Venkata Krishna. Сохранить изображение на диск довольно просто.

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

/**
 * @return true if the external storage is mounted or read only.
 */
public static boolean isExternalStorageReadable() {
    String state = Environment.getExternalStorageState();
    return Environment.MEDIA_MOUNTED.equals(state) || Environment.MEDIA_MOUNTED_READ_ONLY.equals(state);
}

/**
 * @return true if the external storage is mounted and writable.
 */
public static boolean isExternalStorageWritable() {
    String state = Environment.getExternalStorageState();
    return Environment.MEDIA_MOUNTED.equals(state);
}

Затем еще один метод, который проверит, достаточно ли у нас свободного места на внешнем диске хранения.

/**
 * @return the amount of free space on the external storage.
 */
public static long getAvailableExternalMemorySize() {
    File path = Environment.getExternalStorageDirectory();
    StatFs stat = new StatFs(path.getPath());
    long blockSize = stat.getBlockSize();
    long availableBlocks = stat.getAvailableBlocks();
    return availableBlocks * blockSize;
}

Теперь мы создадим метод, который сообщит нам, можем ли мы сохранить файл на SD-карте.

/**
 * @return true if the external storage is available, writable, 
 * and contains enough free space.
 */
public static boolean isExternalStorageAvailable() {
    if (!isExternalStorageWritable()) return false;
    long availableSize = getAvailableExternalMemorySize();
    if (availableSize < REQUIRED_STORAGE_SPACE) {
        return false;
    }
    return true;
}

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

Теперь мы создадим метод для хранения изображения.

/**
 * @return the File from the given filename.
 */
public static File getImageFile(String filename) {
    if (!isExternalStorageReadable()) return null;
    // The images folder path.
    String imagesFolder = Environment.getExternalStorageDirectory().getPath()
                          + "Android/data/your.app.package/images/";
    // Creating the file.
    File file = new File(imagesFolder + filename);        
    return file;
}

/**
 * Write the contents of the HTTP entity to the external 
 * storage if available and writable.
 */
public static boolean storeImage(HttpEntity entity, String filename) throws IOException     {
    if (isExternalStorageAvailable()) {
        File file = getImageFile(filename);
        if (file == null) return false;
        // Write to file output stream.
        FileOutputStream os = new FileOutputStream(file);
        entity.writeTo(os);
        os.close();
        return true;
    }
    return false;
}

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

0 голосов
/ 07 марта 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...