0

データベースから SMS レコードを読み取り、テキスト ファイルに書き込みます。しかし、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();

それを改善するための任意のアイデア???thanks :)))

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がサポートする他のプラグマを確認してください:http ://www.sqlite.org/


アップデート:

queryAPIのドキュメントから:

最高のパフォーマンスを得るには、発信者は次のガイドラインに従う必要があります。

  • 使用されないストレージからのデータの読み取りを防ぐために、明示的な予測を提供します。
  • 選択'phone=?'パラメーターで明示的な値の代わりに疑問符パラメーターマーカーを使用して、それらの値のみが異なるクエリがキャッシュの目的で同じものとして認識されるようにします。
于 2012-09-21T19:04:28.347 に答える