Android使用SQLite批量入庫操作性能對比

Android開發過程中經常會用到數據庫,不可避免的會出現批量操作數據庫,比如一次操作需要往數據庫中插入一萬條記錄,這就需要進行批量操作,以下提供了四種批量操作方式,並分別進行對比。

  • 直接使用SQL語句進行插入
  • 直接使用SQL語句插入,添加事務
  • 使用ContentValues方式
  • 使用SQLiteStatement方式

接下來對每一種方式的實現及性能分別進行對比(向統一數據庫同一張表插入一萬條數據):

1.直接使用SQL語句進行插入

實現代碼爲:

@Override
    public CommonResult addGroupMember()
    {
        String insertSQL = "insert into "
                + SQLHelp.GROUP_MEMBER_TABLENAME
                + "("
                + SQLHelp.GROUP_ID
                + ","
                + SQLHelp.MEMBERS_SUBS_ID
                + ","
                + SQLHelp.MEMBER_NICK_NAME
                + ","
                + SQLHelp.MEMBER_ROLE
                + ","
                + SQLHelp.MEMBER_JID
                + ","
                + SQLHelp.MEM_UNION_KEY
                + ","
                + SQLHelp.CREAT_TIME
                + ", "
                + SQLHelp.UPDATE_TIME
                + ","
                + SQLHelp.ORDER_ID
                + ","
                + SQLHelp.EXT
                + " ) values(458906628,85469875,'xinwei',2,100856,18663,'2015-06-08','2015-06-09',123456,'beizhu')";
        SQLiteDatabase sqlDatabase = sqlHelp.getWritableDatabase();

        // 插入一萬條
        for (int i = 0; i < 10000; i++)
        {
            sqlDatabase.execSQL(insertSQL);
        }

        return null;
    }

計時結果如下:
直接插入方式

2.直接使用SQL語句插入,添加事務

這種方法是在第一種方法的基礎上,添加事務操作:

// 開始
sqlDatabase.beginTransaction();

// 設置爲成功
sqlDatabase.setTransactionSuccessful();

// 結束
sqlDatabase.endTransaction();

在操作數據庫之前設置爲開始、數據庫語句執行完畢後,設置數據庫事務爲Success,當執行到sqlDatabase.endTransaction()時,系統會判斷之前是否有設置成功標誌,如果沒有則認爲插入失敗,數據庫自動進行回滾操作。
執行代碼如下:

@Override
    public CommonResult addGroupMemberThing()
    {
        String insertSQL = "insert into "
                + SQLHelp.GROUP_MEMBER_TABLENAME
                + "("
                + SQLHelp.GROUP_ID
                + ","
                + SQLHelp.MEMBERS_SUBS_ID
                + ","
                + SQLHelp.MEMBER_NICK_NAME
                + ","
                + SQLHelp.MEMBER_ROLE
                + ","
                + SQLHelp.MEMBER_JID
                + ","
                + SQLHelp.MEM_UNION_KEY
                + ","
                + SQLHelp.CREAT_TIME
                + ", "
                + SQLHelp.UPDATE_TIME
                + ","
                + SQLHelp.ORDER_ID
                + ","
                + SQLHelp.EXT
                + " ) values(458906628,85469875,'xinwei',2,100856,18663,'2015-06-08','2015-06-09',123456,'beizhu')";

        SQLiteDatabase sqlDatabase = sqlHelp.getWritableDatabase();

        // 開始
        sqlDatabase.beginTransaction();

        // 循環一萬次
        for (int i = 0; i < 10000; i++)
        {
            // 執行語句
            sqlDatabase.execSQL(insertSQL);
        }

        // 成功
        sqlDatabase.setTransactionSuccessful();

        // 結束
        sqlDatabase.endTransaction();

        return null;
    }

執行結束後,結果如下:
添加事務後

3.使用ContentValues方式

使用ContentValues的好處是可以動態拼接SQL語句進行執行,有更好的靈活性,可以直接使用對象進行賦值,代碼如下:

@Override
    public CommonResult addGroupMemberContentValues(CamTalkGroupMemberInfo memberInfo)
    {
        SQLiteDatabase sqlDatabase = sqlHelp.getWritableDatabase();
        try
        {
            sqlDatabase.beginTransaction();

            ContentValues values = new ContentValues();
            if (memberInfo != null)
            {
                values.put(SQLHelp.GROUP_ID, memberInfo.getGroupID());
                values.put(SQLHelp.MEMBERS_SUBS_ID, memberInfo.getMemberSubsID());
                values.put(SQLHelp.MEMBER_NICK_NAME, memberInfo.getMemberNickName());
                values.put(SQLHelp.MEMBER_ROLE, memberInfo.getMemberRole());
                values.put(SQLHelp.MEMBER_JID, memberInfo.getMemberJID());
                values.put(SQLHelp.MEM_UNION_KEY, memberInfo.getMemUnionKey());
                values.put(SQLHelp.CREAT_TIME, convertDate2String(memberInfo.getCreatTime()));
                values.put(SQLHelp.UPDATE_TIME, convertDate2String(memberInfo.getUpdateTime()));
                values.put(SQLHelp.ORDER_ID, memberInfo.getOrderID());
                values.put(SQLHelp.EXT, memberInfo.getExt());

                // 插入10000次
                for (int i = 0; i < 10000; i++)
                {
                    sqlDatabase.insert(SQLHelp.GROUP_MEMBER_TABLENAME, null, values);
                }
            }
            // 成功
            sqlDatabase.setTransactionSuccessful();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        finally
        {
            // 結束
            sqlDatabase.endTransaction();
            sqlDatabase.close();
        }

        return null;
    }

執行完畢後,結果如下:

ContentValues

4.使用SQLiteStatement方式

這個方法與上邊ContentValues方式實現大致類似,不同的是需要自己編寫SQL語句:

@Override
    public CommonResult addGroupMemberStatement(CamTalkGroupMemberInfo memberInfo)
    {
        SQLiteDatabase sqlDatabase = null;

        String insertSQL = "insert into " + SQLHelp.GROUP_MEMBER_TABLENAME + "(" + SQLHelp.GROUP_ID
                + "," + SQLHelp.MEMBERS_SUBS_ID + "," + SQLHelp.MEMBER_NICK_NAME + ","
                + SQLHelp.MEMBER_ROLE + "," + SQLHelp.MEMBER_JID + "," + SQLHelp.MEM_UNION_KEY
                + "," + SQLHelp.CREAT_TIME + ", " + SQLHelp.UPDATE_TIME + "," + SQLHelp.ORDER_ID
                + "," + SQLHelp.EXT + ") values " + "(?,?,?,?,?,?,?,?,?,?)";

        try
        {
            sqlDatabase = sqlHelp.getWritableDatabase();

            // SQL事物控制-結束之前檢測是否成功,沒有成功則自動回滾
            sqlDatabase.beginTransaction();

            SQLiteStatement stat = sqlDatabase.compileStatement(insertSQL);
            stat.bindLong(1, memberInfo.getGroupID());
            stat.bindString(2, memberInfo.getMemberSubsID());
            stat.bindString(3, memberInfo.getMemberNickName());
            stat.bindLong(4, memberInfo.getMemberRole());
            stat.bindString(5, memberInfo.getMemberJID());
            stat.bindString(6, memberInfo.getMemUnionKey());
            stat.bindString(7, convertDate2String(memberInfo.getCreatTime()));
            stat.bindString(8, convertDate2String(memberInfo.getUpdateTime()));
            stat.bindString(9, memberInfo.getOrderID());
            stat.bindString(10, memberInfo.getExt());

            // 插入10000次
            for (int i = 0; i < 10000; i++)
            {
                stat.executeInsert();
            }

            // 成功
            sqlDatabase.setTransactionSuccessful();
        }
        catch (SQLException e)
        {
            e.printStackTrace();
        }
        finally
        {
            // 結束
            sqlDatabase.endTransaction();
            sqlDatabase.close();
        }
        return null;
    }

執行結果如下:
Statement

5.總的對比圖

對比

綜上,對比四種結果,使用SQLiteStatement 插入最快,插入一萬條數據,只需三秒鐘,性能最好。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章