我的数据库中有一个包含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”(如果可能)会使性能有所不同?
答案 0 :(得分:2)
在您的PC上创建并填充数据库并将其放入应用程序的资产中。您只需在首次启动应用程序时将db文件从资产复制到应用程序的数据文件夹。
或者您可以使用事务来加速插入。如果db中有任何索引,则在插入所有数据后创建它们。
答案 1 :(得分:1)
更快地创建数据库表
您无需在PC上创建数据库。您所需要的只是使用TRANSACTION
来快速提高插入速度。
我做了一些测试,有和没有交易的插入之间的区别是显着的:
另外值得一提的是,交易的使用是非常好的做法。您处理数据库变得更有效率,更重要的是更安全。
但现在,这是一个问题。
由于您希望改进表的创建,因此表中可能有更多的行。现在,将数据库存储在内部存储上是否高效且有效?
将数据库存储在外部存储上会更好吗?保存数据库敏感数据?如果没有,我应该将数据库存储在SD卡上,否则我应该将db存储在内部存储器上以解决安全问题/原因。
答案 2 :(得分:0)
你可以在android中找到InsertHelper。
通过使用此类,您可以在不到一秒的时间内完成插入操作。
:o
要了解如何实施此功能,请参阅:http://orange-coding.net/2012/04/13/inserthelperandroid/
http://www.mysamplecode.com/2011/10/android-sqlite-bulk-insert-update.html
答案 3 :(得分:0)
使用pc创建sqlite数据库并将该数据库运行时放在android数据文件夹中。 使用下面的codde复制数据库。
我使用此代码,我在我的电脑上创建数据库,并将该数据库放入资产文件夹。
并且该数据库复制运行时并放入android中的数据文件夹。
copy data base in android data folder enter link description here
答案 4 :(得分:0)
据我所知,当应用程序启动时,您的数据库已填充,然后您不再需要添加食谱,我是否正确?
If you are using a SQLiteOpenHelper as the official documentation suggests,您可以调用从onCreate,onUpdate和onDownGrade方法将所有数据插入数据库的函数。
正如您所看到的here,这些方法在事务之间被调用,因此您重构代码的努力就像将方法调用从类移动到另一个类一样困难。
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/