SQLite更新查询优化

时间:2014-05-21 15:04:18

标签: android performance android-sqlite

我的部分功能需要更新每一行中的值(当用户选择某个设置时,很少发生这种情况)。

麻烦的是,查询需要花费几分钟才能执行(充其量),并且只有269个测试记录。有什么办法可以优化吗?

    String allRecords = "SELECT id, weight FROM Workout_Entry";

    Cursor cursor = db.rawQuery(allRecords, null);

    int rows = cursor.getCount();

    int id;
    double weight;

    try
    {
        if (cursor.moveToFirst())
        {
            do
            {
                for (int i = 0; i < rows; i++)
                {
                    id = cursor.getInt(0);
                    weight = cursor.getInt(1) / 2.2;

                    String strFilter = "id = " + id;
                    ContentValues args = new ContentValues();
                    args.put("weight", weight);

                    db.update("Workout_Entry", args, strFilter, null);

                }

            } while (cursor.moveToNext());
        }
    } finally
    {
        cursor.close();
    }

    (db).close();

谢谢!

3 个答案:

答案 0 :(得分:2)

只需将工作推送到数据库引擎,而不是一次将数据拉出一行并每次启动一个新的更新查询。用以下代码替换您的代码:

db.execSQL("UPDATE Workout_Entry SET weight=weight/2.2");

此外,由于这似乎是某种公制/英制单位转换,因此请考虑将数据保存在数据库中的一种格式中,并将/格式转换为适当的单位以供显示。

答案 1 :(得分:1)

您应该学会使用交易 - 您可以在此presentation of mine中看到如何使用交易的示例。

同时显示不使用交易的影响。

答案 2 :(得分:0)

好的,我意识到自己的错误。我为每条记录都有一个do while循环,其中有for loop循环x多次,其中x是现有记录的数量。

所以它经历了O(n)²次,而不是O(n)

感谢那些回复的人!我发现你的两条评论都很有用。