【问题标题】:android : Loading data from XML to SQLite take very long time [duplicate]android:将数据从 XML 加载到 SQLite 需要很长时间 [重复]
【发布时间】:2014-07-10 06:57:29
【问题描述】:

我有非常大的表 300,000 条记录 我正在从 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();
    }

}

【问题讨论】:

  • 您是否对您的代码进行了基准测试,以准确了解它在哪里花费了那么多时间?另外,为什么不预先填充 sqllite 并将其作为二进制 blob 分发?
  • 如何预填充 sqllite 并将其作为二进制 blob 分发?
  • @asmgx 你可以试试这个github.com/jgilfelt/android-sqlite-asset-helper 或者你可以手动复制文件
  • 您的意思是手动复制 SQLite 文件?这可能吗?怎么做?
  • 如果您不知道如何手动复制它,请使用上面链接中的库。它会为你复制数据库文件。

标签: java android xml performance sqlite


【解决方案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();
}

【讨论】:

    猜你喜欢
    • 2019-08-03
    • 1970-01-01
    • 2017-08-10
    • 2019-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多