Android SQLite插入性能

时间:2018-11-20 22:56:04

标签: android performance sqlite insert

我可能只是遇到了SQLite的本机性能问题,但是即使使用事务处理和预编译的语句,插入SQLite似乎也存在相当大的开销。也许我使用不正确。

我需要逐行(通过URL)读取文件并创建行。该机制是通用的,因此可以(在合理的范围内)创建任何表并添加任意数量的行。我看到较大的刀片具有相当不错的性能,但较小的刀片似乎至少需要+ 400ms的时间。由于我可能要加载其中的100多个,因此较小的开销导致了较长的加载时间。

例如一些时间安排

   34 records Test #1  ---->  490 ms
36238 records Test #2  ----> 3021 ms
    4 records Test #3  ---->  520 ms

这是代码(我剪掉了所有的try / catches和其他代码,将其简化为实际的插入代码):

        InputStream input = new BufferedInputStream(url.openStream());

        // Create the file reader
        BufferedReader  br = new BufferedReader(new InputStreamReader(input, "UTF-8"));
        StringBuffer insertSql = null;

        // Build the SQL to bind
        insertSql = new StringBuffer("INSERT INTO " + fileName + " (");
        String sep = "";
        insertSql.append("[" + getDbColumnNames().replaceAll(" ", "").replaceAll(",", "],[") + "]");
        String[] columns = getDbColumnNames().split(",");
        insertSql.append(") VALUES (");
        for (@SuppressWarnings("unused") String col : columns) {
            insertSql.append(sep.trim() + "?");
            sep = ",";
        }
        insertSql.append(");");
        this.open();
        sqlDB.beginTransaction();
        SQLiteStatement stmt = = sqlDB.compileStatement(insertSql.toString());

        String line = "";
        // Read the file line by line
        while ((line = br.readLine()) != null) {
            String[] tokens = line.split(",");
            // Build the bindings and insert the data
            int bindcnt = 1;
            for (String token : tokens) {
                 stmt.bindString(bindcnt++, token.trim());
            }

            long entryID = stmt.executeInsert();
            if (entryID < 0) {
                success = false;
            }
            stmt.clearBindings();
        }
        sqlDB.setTransactionSuccessful();
        sqlDB.endTransaction();

我已经证实,对于大多数读取来说,读取缓冲区的开销并不重要。

0 个答案:

没有答案