从数据库读取短信并将其存储到文本文件中的时间过长

时间:2012-09-21 18:05:11

标签: android sms

我正在从数据库中读取短信记录并将其写入文本文件。但是读取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();

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

2 个答案:

答案 0 :(得分:1)

只需删除此行:

sleep(200);

答案 1 :(得分: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/


更新

来自query API的文档:

为获得最佳性能,来电者应遵循以下准则:

  • 提供明确的投影,以防止从存储中读取不会被使用的数据。
  • 使用问号参数标记(例如 'phone=?' 而不是选择参数中的显式值,以便识别仅由这些值不同的查询与缓存目的相同。