Сохранение изображения в БД в Android - PullRequest
1 голос
/ 13 декабря 2011

Я пытаюсь сохранить изображения с телефона Android в БД SQLite. Вот код:

Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() {
        @Override
        public void onPictureTaken(byte[] data, Camera c) {
            currentPictureName = Utils.getUserName(getApplicationContext()) 
                    + System.currentTimeMillis() + ".jpg";

            DBHelper helper = new DBHelper(getApplicationContext());
            SQLiteDatabase db = helper.getReadableDatabase();
            ContentValues values = new ContentValues();
            values.put("name", currentPictureName);
            values.put("image", data);
            //db.insert(DBHelper.TABLE_NAME, null, values);
            DBHelper.insertDB(db, DBHelper.TABLE_NAME, null, values);

            mCamera.startPreview();
        }
    };

DBHelper.java

package com.apps.terrapin;

import android.content.ContentValues;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class DBHelper extends SQLiteOpenHelper {
    private static Context mContext;
    private static final int DATABASE_VERSION = 1;
    private static final String DATABASE_NAME = "terrapin";
    public static final String TABLE_NAME = "images";
    private static final String TABLE_CREATE =
                "CREATE TABLE " + TABLE_NAME + " (" +
                "_id INTEGER PRIMARY KEY, name TEXT, image BLOB);";

    DBHelper(Context context) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        mContext = context;
    }

    public static void insertDB(final SQLiteDatabase db, String tableName, String hack, final ContentValues values) {
        Log.e("TAG", "Insert DB");
        new Thread(new Runnable() {
            public void run() {
                db.insert(DBHelper.TABLE_NAME, null, values);
            }
        }).start();
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        Log.e("TAG", "Creating DB");
        db.execSQL(TABLE_CREATE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        if (oldVersion >= newVersion)
            return;

        onCreate(db);       
    }
}

Проблема в том, что мое приложение несколько раз правильно сохраняет изображения, а затем, когда я нажимаю кнопку сохранения изображения, оно зависает. Затем Android просит меня закрыть его. У меня была эта проблема с обычным insert методом, поэтому я думал, что вставка вставки в поток может помочь. Но это не так. Что здесь не так? Logcat не показывает ошибок, есть одна строка, которая говорит

    12-13 05:02:08.005: I/InputDispatcher(93): Application is not responding: 
Window{406d17f8 com.apps.terrapin/com.apps.terrapin.TerraPin paused=false}.  
10013.7ms since event, 10012.2ms since wait started

Я использую уровень API 10

1 Ответ

1 голос
/ 13 декабря 2011

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

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