2014-12-06 63 views
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; 
    } 

回答

1

实际上从数据库加载一行是不必要的,如果你只是想检查它是否存在;使用类似EXISTS或helper function

long count = DatabaseUtils.queryNumEntries(database, "sensordata", 
       "sensor_date = " + db_dateLong + " AND sensor_id = ?", 
       new String[]{ sensor_name }); 
if (count > 0) { 
    ... 

然而,最大的放缓来自于数据库中搜索行。 你需要索引搜索栏获得快速查找:

CREATE INDEX insert_name_here ON sensordata(sensor_date, sensor_id); 
+0

谢谢,我已经加入databaseutils例如但是db_dateLong,传感器名称不都是字符串[]。 db_dateLong很长,sensor_name是字符串。有没有办法呢? – Mark 2014-12-06 16:00:50

+0

您在查询中将它用作字符串。 – 2014-12-06 16:20:58

+0

数据库是int并且var很长 类型不匹配:不能从long转换为String – Mark 2014-12-06 16:30:31