0

我正在从数据库中读取短信记录并将它们写入文本文件。但是读取 n 写入 3500 条记录需要 3 到 4 分钟的时间。如果记录远不止这些,则需要大量时间,这是不可估量的。我的代码是:

final Cursor cur1 = c.getContentResolver().query(Uri.parse("content://sms/"), null, null, null, "date ASC");
final int size = cur1.getCount();

final int sleeptimer = size;

final SMS [] sms = new SMS[size];

final String baseDir = Environment.getExternalStorageDirectory().getAbsolutePath()+ File.separator + "account.txt";

FileWriter fw = null;
try {
    fw = new FileWriter(baseDir);
} catch (IOException e1) {
    // TODO Auto-generated catch block
    e1.printStackTrace();
}
final BufferedWriter writer = new BufferedWriter(fw);

Thread  myThread = new Thread()
{
    public void run()
    {
        try
        {
            int currentwait = 0;
            int j=0;
            while(currentwait < sleeptimer)
            {
                sleep(200);
                currentwait+=200;
                for(int i = 0 ; i < 200 ; i++)
                {
                    if(!cur1.moveToNext())
                    {
                        break;
                    }
                    ContactInfo p = new ContactInfo();
                    String content = cur1.getString(cur1.getColumnIndex("body"));
                    String number = cur1.getString(cur1.getColumnIndex("address"));
                    long date = cur1.getLong(cur1.getColumnIndex("date"));
                    String protocol = cur1.getString(cur1.getColumnIndex("protocol"));
                    String name = p.getName(number, c);
                    String type = null;

                    Calendar cal=Calendar.getInstance();
                    cal.clear();
                    cal.setTimeInMillis(date);

                    String date_time=String.format("%1$te %1$tB %1$tY,%1$tI:%1$tM:%1$tS %1$Tp",cal);

                    if( protocol == null )
                    {
                        type = "Outbox";
                    }
                    else
                        type = "Inbox";

                    try{

                        writer.write("Type: " + type);
                        writer.newLine();

                        writer.write("Name: " + number+"<"+name+">");
                        writer.newLine();

                        writer.write("Date: " + date_time);
                        writer.newLine();

                        writer.write("Content: " + content);
                        writer.newLine();
                        writer.newLine();


                    } catch (IOException e) {
                        Log.i("INFO", e.getMessage().toString());
                    }

                    //Log.i("INFO", content+" "+j);

                    sms[j] = new SMS(type , name , number , date_time , content );
                    j++;
                }
            }
        }
        catch(Exception e)
        {

        }
        finally{
            try{
            writer.flush();
            writer.close();
            }
            catch (Exception e) {

            }

            uploadtoserver(baseDir);
        }
    }
};
myThread.start();

任何改进它的想法???谢谢:)))

4

2 回答 2

1

只需删除此行:

sleep(200);
于 2012-09-21T18:39:29.330 回答
0

调用setMaxSqlCacheSize增加缓存大小。默认为10。先尝试设置20,看看时间是否减少到一半..

或/和

您可以在对 db 执行任何操作之前执行此 sqlite 查询,看看这是否会提高速度。将临时存储更改为memory应该可以提高读写速度..

PRAGMA temp_store = 2; /* 0 | DEFAULT | 1 | FILE | 2 | MEMORY; */

当 temp_store 为 MEMORY (2) 时,临时表和索引被保存在内存中,就好像它们是纯内存数据库内存一样

PRAGMA page_size = bytes;

查询或设置数据库的页面大小。页面大小必须是 512 和 65536(含)之间的 2 的幂。

可能您可以将这些语句传递给execSQL(String sql)或传递给query(). 试着让我知道它是如何工作的。

查看 Sqlite 支持的其他 PRAGMA:http ://www.sqlite.org/


更新:

queryAPI 文档:

为了获得最佳性能,调用者应遵循以下准则:

  • 提供显式投影,以防止从存储中读取不会使用的数据。
  • 使用问号参数标记'phone=?'代替选择参数中的显式值,以便仅将这些值不同的查询识别为相同的缓存目的。
于 2012-09-21T19:04:28.347 回答