Android   发布时间:2022-04-28  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Android中的外部存储上的SQLite性能不佳大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在使用外部存储器在等待发送到服务器时将事件存储在数据库中.

我在插入记录时看到了非常糟糕的表现.
我知道外部存储器可能很慢,但我想看到一些数字,所以我写了一个测试它的小应用程序.

这是代码

public static final int INSERTS = 100;

File dbFile = new File(Environment.getExternalStorageDirectory(),"test.sqlite3");
// File dbFile = new File(getFilesDir(),"test.sqlite3");
dbFile.delete();

sqliteDatabase db = sqliteDatabase.openOrCreateDatabase(dbFile,null);

db.execsql("create table events (_id INTEGER PRIMary key autoincrement,event_type TEXT NOT NULL,timestamp BIGINT,data text);");
db.execsql("CREATE INDEX mainIndex ON events (event_type,timestamp ASC);");

InsertHelper Helper = new InsertHelper(db,"events");

final int eventTypeCol = Helper.getcolumnIndex("event_type");
final in@R_450_3056@Col = Helper.getcolumnIndex("timestamp");
final int dataCol = Helper.getcolumnIndex("data");

long start = System.currentTimeMillis();

String eventType = "foo",data = "bar";
long timestamp = 4711;

for(int i = 0; i < INSERTS; ++i) {
    Helper.prepareForinsert();
    Helper.bind(eventTypeCol,eventTypE);
    Helper.bind(timestampCol,timestamp);
    Helper.bind(dataCol,data);
    Helper.execute();
}

long end = System.currentTimeMillis();

Log.i("Test",String.format("InsertHelper,Speed: %d ms,Records per second: %.2f",(int)(end-start),1000*(doublE)INSERTS/(doublE)(end-start)));

db.close();
dbFile.delete();

db = sqliteDatabase.openOrCreateDatabase(dbFile,timestamp ASC);");


start = System.currentTimeMillis();
ContentValues cv = new ContentValues();

for(int i = 0; i < INSERTS; ++i) {
    cv.put("event_type",eventTypE);
    cv.put("timestamp",timestamp);
    cv.put("data",data);
    db.insert("events",null,cv);
}

end = System.currentTimeMillis();

Log.i("Test",String.format("Normal,end-start,1000*(doublE)INSERTS/(doublE)(end-start)));

db.close();
dbFile.delete();

数据库与我的真实应用程序使用的数据库完全一样,我尝试删除索引,但它没有任何区别.

结果如下:

Nexus One,Internal memory

      Method | Records | Time (ms) | Records per second
-------------+---------+-----------+--------------------
      Normal |   100   |    2072   |       48.26
InsertHelper |   100   |    1662   |       60.17


Nexus One,External memory:

      Method | Records | Time (ms) | Records per second
-------------+---------+-----------+--------------------
      Normal |   100   |    7390   |       13.53
InsertHelper |   100   |    7152   |       13.98


Emulator,Internal memory:

      Method | Records | Time (ms) | Records per second
-------------+---------+-----------+--------------------
      Normal |   100   |    1803   |       55.46
InsertHelper |   100   |    3075   |       32.52


Emulator,External memory:

      Method | Records | Time (ms) | Records per second
-------------+---------+-----------+--------------------
      Normal |   100   |    5742   |       17.42
InsertHelper |   100   |    7164   |       13.96 

正如您所看到的,模拟器不可信任,InsertHelper应该更快.
当然,这是预期的,测试主要是出于好奇.

然而,让我担心的是当我使用外部存储器时手机性能不佳,我是否错过了SQLiteDatabase的一些关键方面,还是只是为了让SD卡变慢?

我可以在我的真实应用程序中添加我已禁用locking并且它没什么区别.

解决方法

CommonsWare的评论是正确的.对数据库性能产生重大影响的是使用事务.在事务中包装插入循环.我不是100%确定它是否适用于InsertHelper,但您可以尝试用以下方法替换for循环:
db.begintransaction();
try {
    for(int i = 0; i < INSERTS; ++i) {
        Helper.prepareForinsert();
        Helper.bind(eventTypeCol,eventTypE);
        Helper.bind(timestampCol,timestamp);
        Helper.bind(dataCol,data);
        Helper.execute();
    }
    db.settransactionsuccessful();
} finally {
    db.endtransaction();
}

大佬总结

以上是大佬教程为你收集整理的Android中的外部存储上的SQLite性能不佳全部内容,希望文章能够帮你解决Android中的外部存储上的SQLite性能不佳所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。