3

我的数据库中有一个表,它有 14 列和 125 行。当我启动我的应用程序来创建数据库时,肯定会花费太多时间(在我看来):我做了 16 次尝试,这些就是结果。

===========================
 Average time:    12.715 s
 Minimum time:     8.486 s
 Maximum time:    21.159 s
===========================

这就是我创建表的方式:

private static final String DATABASE_RECIPES_CREATE = "CREATE TABLE IF NOT EXISTS "
    + MetaData.TABLE_RECIPES + " ("
    + MetaData.KEY_ID + " integer primary key autoincrement, "
    + MetaData.KEY_NEW + " integer not null, "
    + MetaData.KEY_TITLE + " text not null, "
    + MetaData.KEY_INGREDIENTS + " text not null, "
    + MetaData.KEY_TIME + " text not null, "
    + MetaData.KEY_PEOPLE + " text not null, "
    + MetaData.KEY_WINE + " text, "
    + MetaData.KEY_SUGGESTIONS + " text, "
    + MetaData.KEY_DIRECTIONS + " text not null, "
    + MetaData.KEY_AUTHOR + " text, "
    + MetaData.KEY_DIFFICULTY + " text not null, "
    + MetaData.KEY_CATEGORY + " text not null, "
    + MetaData.KEY_VEGETARIAN + " integer, "
    + MetaData.KEY_IMAGE + " text)";

这就是我将所有行值添加到表中的方式:

public long addRecipe(int _id, int _new, String _title, String _ingredients, String _time, String _people, String _wine, String _suggestions, 
        String _directions, String _author, String _difficulty, String _category, int _vegetarian, String _image) 
{
    ContentValues initialValues = new ContentValues();

    initialValues.put(MetaData.KEY_ID, _id);
    initialValues.put(MetaData.KEY_NEW, _new);
    initialValues.put(MetaData.KEY_TITLE, _title);
    initialValues.put(MetaData.KEY_INGREDIENTS, _ingredients);
    initialValues.put(MetaData.KEY_TIME, _time);
    initialValues.put(MetaData.KEY_PEOPLE, _people);
    initialValues.put(MetaData.KEY_WINE, _wine);
    initialValues.put(MetaData.KEY_SUGGESTIONS, _suggestions);
    initialValues.put(MetaData.KEY_DIRECTIONS, _directions);
    initialValues.put(MetaData.KEY_AUTHOR, _author);
    initialValues.put(MetaData.KEY_DIFFICULTY, _difficulty);
    initialValues.put(MetaData.KEY_CATEGORY, _category);
    initialValues.put(MetaData.KEY_VEGETARIAN, _vegetarian);
    initialValues.put(MetaData.KEY_IMAGE, _image);

    return mDb.insert(MetaData.TABLE_RECIPES, null, initialValues);
}

问题:

由于我的最终表将包含至少 400 行,有什么方法可以加快它的创建速度?

编辑 1: 我再添加一个问题:对于某些列,根本不需要“text”或“int”类型。将它们更改为“tinytext”、“smallint”和“tinyint”(在可能的情况下)会产生任何性能差异吗?

4

5 回答 5

2

在您的 PC 上创建和填充数据库并将其放入应用程序的资产中。您只需在应用首次启动时将 db 文件从资产复制到应用的数据文件夹。

或者您可以使用事务来加速插入。如果您在 db 中有任何索引,请在插入所有数据后创建它们。

于 2013-04-10T11:26:18.200 回答
1

更快的数据库表创建

您无需在 PC 上创建数据库。您所需要的只是使用TRANSACTION它来快速提高您的插入速度。

我做了一些测试,插入和不插入事务之间的区别是显着的:

  • 插入 100 000 行大约需要 55,015 秒(有事务),而没有事务的插入则需要6 分钟以上。

另外值得一提的是,使用事务是非常好的做法。您对数据库的处理变得更加高效,并且主要更加安全。

但是现在,这里有一个问题。

由于您想改进表的创建,因此表中的行数可能更多。现在,将数据库存储在内部存储上是否既好又高效?

将数据库存储在外部存储上会更好吗?保存数据库敏感数据?如果没有,我应该将数据库存储在 SD 卡上,否则出于安全问题/原因,我应该将数据库存储在内部存储中。

于 2013-04-10T11:45:18.400 回答
0

据我了解,您的数据库在应用程序启动时已填充,然后您不再需要添加食谱,对吗?

如果您按照官方文档的建议使用 SQLiteOpenHelper,您可以调用将所有数据从 onCreate、onUpdate 和 onDownGrade 方法插入数据库的函数。

正如您在此处看到的那样,这些方法在事务之间被调用,因此您重构代码的努力就像将方法调用从一个类移到另一个类一样困难。

       db.beginTransaction();
       try {
            if (version == 0) {
                onCreate(db);
            } else {
                if (version > mNewVersion) {
                    onDowngrade(db, version, mNewVersion);
                } else {
                    onUpgrade(db, version, mNewVersion);
                }
            }
            db.setVersion(mNewVersion);
            db.setTransactionSuccessful();
        } finally {
            db.endTransaction();
        }

如果你不是,我强烈建议你使用一个,它会使你的数据库在不同版本之间的升级更容易:

这里的文档

附加参考:

即使与 android 没有直接关系,这是一篇有趣的文章,它讨论了快速插入的优化。 http://www.altdevblogaday.com/2012/05/16/sql-server-high-performance-inserts/

于 2013-04-12T19:54:06.703 回答
0

您可以在 android 中使用InsertHelper

通过使用这个类,您实际上可以在不到一秒的时间内完成插入操作。

:O

要知道如何实现这一点,请参阅:http: //orange-coding.net/2012/04/13/inserthelperandroid/

http://www.mysamplecode.com/2011/10/android-sqlite-bulk-insert-update.html

于 2013-04-10T11:30:22.657 回答
0

使用 pc 创建 sqlite 数据库并将该数据库运行时放在 android 数据文件夹中。使用下面的代码复制数据库。

我正在使用此代码,我正在我的电脑中创建数据库,并将该数据库放入资产文件夹中。

并且该数据库复制运行时并放入android中的数据文件夹中。

在 android 数据文件夹中复制数据库 在此处输入链接描述

于 2013-04-10T11:41:01.573 回答