0
以下代碼位於異步任務中,該任務在解析並將它們添加到sqlite數據庫之前通過互聯網獲取csv文件。查詢重複數據時的Android Sqlite插入速度
由於這個我需要檢查,在添加任何新行之前,他們不存在於數據庫中。
我的問題是,使用重複的檢查代碼,每個csv文件需要2.5分鐘,但沒有檢查,每個文件需要6秒。
任何線索如何加快與重複檢查,請?
public class GetData extends AsyncTask<String, String, String> {
@Override
protected String doInBackground(String... params) {
//for each csv file
for (int x = 0; x < 11; x++) {
get_config("sen" + x + "data.csv");
}
return null;
}
private void get_config(String siteurl) {
StringBuilder total = new StringBuilder();
String mfolder = Environment.getExternalStorageDirectory().getPath() + "/HG";
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(mcontext);
String basesiteurl = prefs.getString("site_url", "");
if (!DetectConnection.checkInternetConnection(mcontext)) {
write_alertlog("AlertService: Fetch csv data - No internet connection");
}else{
write_alertlog("AlertService: Fetch csv data - Internet connection success");
String onlineupdateline = "";
try {
Random randomGenerator = new Random();
int randomInt = randomGenerator.nextInt(100); //defeat android cache
DefaultHttpClient httpclient = new DefaultHttpClient();
HttpGet httppost = new HttpGet(basesiteurl + "/csv/" + siteurl + "?unused=" + randomInt);
HttpParams httpParameters = new BasicHttpParams();
HttpConnectionParams.setConnectionTimeout(httpParameters, 8000);
HttpConnectionParams.setSoTimeout(httpParameters, 8000);
HttpResponse response = httpclient.execute(httppost);
HttpEntity ht = response.getEntity();
BufferedHttpEntity buf = new BufferedHttpEntity(ht);
InputStream is = buf.getContent();
BufferedReader r = new BufferedReader(new InputStreamReader(is));
//reformat csv filename into sensor name for db
String sensor_name = siteurl.replace("data.csv", "");
database.beginTransaction();
String line;
while ((line = r.readLine()) != null) {
//total.append(line + "\n");
if (line.contains("<!DOCTYPE")){
write_applog("AlertService: Fetch csv data - csv file empty or does not exist: " + siteurl);
Log.d("test", "csv file empty or does not exist: " + siteurl);
database.endTransaction();
is.close();
r.close();
return;
}
List<String> singlecsvline = new ArrayList<String>(Arrays.asList(line.split(",")));
//csv date format
SimpleDateFormat fmt = new SimpleDateFormat("EEE MMM dd HH:mm:ss yyyy");
Date pi_date = null;
try {
pi_date = fmt.parse(singlecsvline.get(0).toString().trim());
} catch (ParseException e) {
e.printStackTrace();
}
//database date format
fmt = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String db_dateString = fmt.format(pi_date);
Date d = null;
try {
d = fmt.parse(db_dateString);
} catch (ParseException e) {
e.printStackTrace();
}
long db_dateLong = d.getTime();
//check if not in db already and if not add it
//this duplicate check makes processing each csv file go from 6 secs to 2.5 minutes
sql = "SELECT * FROM sensordata WHERE sensor_date='" + db_dateLong + "' AND sensor_id='" + sensor_name + "'" ;
Cursor findrawdata2 = database.rawQuery(sql, null);
if (!findrawdata2.moveToFirst()) {
database.execSQL("INSERT INTO sensordata (sensor_id, sensor_date, sensor_value, alerted, setflag) VALUES ('" + sensor_name + "', '" + db_dateLong + "', '" + Double.parseDouble(singlecsvline.get(1).toString().trim()) + "', '0', '" + setflag + "');");
}else{
//Log.d("test", "Not Adding - exists");
}
findrawdata2.close();
}//for each line in csv file
database.setTransactionSuccessful();
database.endTransaction();
is.close();
r.close();
write_applog("AlertService: Fetch csv data - added sensor " + siteurl);
Log.d("test", "finsihed adding csv sensor " + siteurl);
} catch (ConnectTimeoutException e) {
write_alertlog("AlertService: Fetch csv data - Internet connection request timed out >6000ms");
} catch (MalformedURLException e) {
write_alertlog("AlertService: Fetch csv data - Error - " + e.toString());
} catch (IOException e) {
write_alertlog("AlertService: Fetch csv data - Error - " + e.toString());
}
}//have internet connection
return;
}
謝謝,我已經加入databaseutils例如但是db_dateLong,傳感器名稱不都是字符串[]。 db_dateLong很長,sensor_name是字符串。有沒有辦法呢? – Mark 2014-12-06 16:00:50
您在查詢中將它用作字符串。 – 2014-12-06 16:20:58
數據庫是int並且var很長 類型不匹配:不能從long轉換爲String – Mark 2014-12-06 16:30:31