2014-07-10 64 views
0

我有非常大的表300,00條記錄 我從XML文件中的SQLite加載,安卓:加載數據從XML到SQLite的花費很長的時間

不幸的是,這是採取非常非常長的時間(用了15分鐘,然後我不得不阻止它)。

這是正常的嗎?

我的代碼有什麼問題。

如何加快速度?

感謝

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_list_filter); 

     new Thread(new Runnable() { 
      public void run() { 
       FillLocations(); 
      } 
     }).start(); 

} 




private void FillLocations() 
{ 
    OpenDB(); 
    Resources res = getResources(); 
    ContentValues _Values = new ContentValues(); 

    //Open xml file 
    XmlResourceParser _xml = res.getXml(R.xml.locations); 
    try 
    { 
     //Check for end of document 
     int eventType = _xml.getEventType(); 
     while (eventType != XmlPullParser.END_DOCUMENT) { 
      //Search for record tags 
      if ((eventType == XmlPullParser.START_TAG) &&(_xml.getName().equals("Cities"))){ 
       //Record tag found, now get values and insert record 
       String City = _xml.getAttributeValue(null, "City"); 
       String Country = _xml.getAttributeValue(null, "Country"); 
       String Time = _xml.getAttributeValue(null, "Time"); 
       _Values.put("City", City); 
       _Values.put("Country", Country); 
       _Values.put("Time", Time); 
       db.insert("Locations", null, _Values); 
      } 
      eventType = _xml.next(); 
     } 
    } catch (XmlPullParserException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 

} 
+0

你有沒有基準測試你的代碼,看看它花了多少時間?另外,爲什麼不預先填充sqllite並將其作爲binarly blob分發? –

+0

如何預填充sqllite並將其作爲binarly blob分發? – asmgx

+1

@asmgx你可以試試這個https://github.com/jgilfelt/android-sqlite-asset-helper或者你可以手動複製文件 – LordRaydenMK

回答

1

試試這個代碼:

之前while循環的BeginTransaction和所有行endSuccessfullTransaction的成功插入後。

public static void beginTransaction() 
{ 
    final SQLiteDatabase db = openDatabase(); 
    if (db != null) 
    { 
     db.beginTransaction(); 
    } 
} 

public static void endSuccessfullTransaction() 
{ 
    final SQLiteDatabase db = openDatabase(); 
    db.setTransactionSuccessful(); 
    db.endTransaction(); 
}