Как оптимизировать вставку записи с несколькими строками и изображениями в базу данных SQLite - PullRequest
3 голосов
/ 05 декабря 2011

Я определил метод для добавления записи в мой вспомогательный класс базы данных и вставки данных в базу данных, используя его, но он не работает. Это мой метод, определенный в классе databasehelper:

 public void createchannelEntry(ChannelPoster channel) {
        openDB();
        ByteArrayOutputStream out = new ByteArrayOutputStream();
        channel.getPoster().compress(Bitmap.CompressFormat.PNG, 100, out);
        ContentValues cv = new ContentValues();
        cv.put(KEY_POSTER, out.toByteArray());            
        cv.put(KEY_CHANNEL, channel.getChannel());
        cv.put(KEY_PATH, channel.getPath());
        cv.put(KEY_DBLINK, channel.getDBlink());

        mDb.insert(channelS_TABLE, null, cv);
        closeDB();
    }

вот как я вставляю данные

Bitmap sherlock = BitmapFactory.decodeResource(getResources(), R.drawable.sherlock);

mDB.createchannelEntry(new ChannelPoster(sherlock, "aa" ,"ll"  ,"ha" ));

и у меня есть JavaBean для хранения записи

public class ChannelPoster {
    private Bitmap poster;
    private String channel;
    private String path;
    private String dblink;

    public ChannelPoster(Bitmap pi, String c, String p, String d) {
        poster = pi;
        channel = c;
        path = p;
        dblink = d;
    }

    public Bitmap getPoster() { return poster; }
    public String getChannel() { return channel; }
    public String getPath() { return path; }
    public String getDBlink() { return dblink; }
}

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

1 Ответ

4 голосов
/ 05 декабря 2011

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

Если вы не хотите этого делать, есть две вещи, которые по-прежнему значительно улучшат скорость вашей обработки:

  • Открывайте и закрывайте базу данных * только 1011 *один раз вокруг всех ваших вставок
  • Используйте транзакцию

Примерно так:

SQLiteDatabase db = openDB();
db.beginTransaction();

try {
    // Add here the loop with all your inserts
    db.setTransactionSuccessful();
} finally {
    db.endTransaction();  // will rollback and cancel the inserts if not marked as successful
    db.close();
}

(finallyчтобы убедиться, что вы закрываете транзакцию и соединение, даже если оно как-то перестает работать во время вставок: в этом случае ALL ваши вставки будут отменены)

...