5

一度に 100000 レコードを android sqlite データベースに挿入しようとしています。私は次の2つの異なる方法を使用しています。

 private void bulkInsertDataBySavePoint(final List<User> users) {
    log.debug("bulkInsertDataBySavePoint()");
    DatabaseConnection conn = null;
    Savepoint savepoint = null;
    try {
        conn = userDao.startThreadConnection();
        savepoint = conn.setSavePoint("bulk_insert");
        for (User user : users) {
            userDao.create(user);
        }
    } catch (SQLException e) {
        log.error("Something went wrong in bulk Insert", e);
    } finally {
        if (conn != null) {
            try {
                conn.commit(savepoint);
                userDao.endThreadConnection(conn);
            } catch (SQLException e) {
                log.error("Something went wrong in bulk Insert", e);
            }
        }
    }
}

   private void bulkInsertDataByCallBatchTasks(final List<User> users) {
    log.debug("bulkInsertDataByCallBatchTasks()");
    try {
        userDao.callBatchTasks(new Callable<Void>() {
            @Override
            public Void call() throws Exception {
                for (User user : users) {
                    userDao.create(user);
                }
                return null;
            }
        });
    } catch (Exception e) {
        e.printStackTrace();
    }
}

どちらの方法も正常に機能します。平均して 140 秒かかり、60 ~ 65% の CPU を使用しますが、これは問題ないと思います。

アイデアは、json データを提供する API を消費する必要があるということです。そのjsonデータを解析してから、オフラインで使用するためにsqliteデータベースに挿入する必要があります。

この問題を解決する効率的な方法を探しています。

何か考えはありますか?

4

3 に答える 3

5

一度に 100000 レコードを android sqlite データベースに挿入しようとしています...平均して 140 秒かかり、60-65% の CPU を消費しますが、これは私の意見では問題ありません。

残念ながら、簡単な答えはありません。限られた Android CPU でより高速なパフォーマンスを実現するには、生の SQL を使用してこの種の挿入を直接行う必要がある場合があります。データを挿入したら、データORMLiteのクエリや操作を高速化できます。

于 2013-07-16T14:22:26.140 に答える
3

私は同じ問題を抱えていて、合理的な回避策を見つけました。これにより、挿入時間が 2 秒から 150 ミリ秒に短縮されました。

final OrmLiteSqliteOpenHelper myDbHelper = ...;
final SQLiteDatabase db = myDbHelper.getWritableDatabase();
db.beginTransaction();
try{
    // do ormlite stuff as usual, no callBatchTasks() needed

    db.setTransactionSuccessful();
}
finally {
    db.endTransaction();
}
于 2014-12-05T11:56:34.757 に答える
1

うーん。良いアイデア@FarrukhNajmi。トランクに追加しました。バージョン 4.49 になります。

@Grayまだ不安定ですか?いつmavenでそれを見ることができますか?

そして、com.j256.ormlite.dao.ForeignCollection#addAll が 1 つのリクエストのみを作成する場合、それも素晴らしいでしょう。

于 2014-10-23T19:49:38.470 に答える