【问题标题】:Importing large data into sqlite db on android - takes too long. need alternatives将大数据导入 android 上的 sqlite db - 需要很长时间。需要替代品
【发布时间】:2016-02-29 16:28:57
【问题描述】:

我的应用程序有一个 sqlite 表...但需要尽快添加/删除大量数据。我对很多选择持开放态度。现在,我有大约 35,000 行可以在大约 15 秒内更新。我更喜欢更快的东西。基本上只需要一列作为我的辅助文本。

现在,用户下载一个 txt 文件,然后将该文件传递给下面的方法。

public boolean installLanguageFile(String resourceId) {

        SQLiteDatabase db;
        db = new DataBaseHelper(getContext()).getWritableDatabase();
        try {

            File mFile = new File(getActivity().getFilesDir() + resourceId);

            InputStream insertsStream = new FileInputStream(mFile);
            BufferedReader insertReader = new BufferedReader(new InputStreamReader(insertsStream));

            long lengthOfFile = 34504;
            long total = 0;
            int rowId = 1;

            String sql = "UPDATE Story_Data SET text2 = ('?') WHERE _id = ?";
            db.beginTransaction();
            SQLiteStatement stmt = db.compileStatement(sql);
            while (insertReader.ready()) {
                total += rowId;
                stmt.bindString(1, insertReader.readLine());
                stmt.execute();
                stmt.clearBindings();
                publishProgress("" + (rowId * 100 / lengthOfFile));
                rowId++;
            }

            db.setTransactionSuccessful();
            db.endTransaction();

            insertReader.close();

            //mCallback.reloadView();
            return true;

        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }

    }

【问题讨论】:

  • 是否也有本地更改,还是所有数据都来自服务器?如果全部来自服务器,最快的方法就是下载一个新的db文件。
  • 如果您因为其他带有用户输入的表而无法执行此操作,但此表来自服务器 - 删除此表并使用所有插入重新创建它可能比更新每一行更快。但这需要您进行基准测试和仔细检查。
  • 你有没有试过不公布每次迭代的进度会快多少?对于初学者,请尝试将其完全删除
  • @GabeSechan 更改来自服务器。我创建/下载数据库没有问题..但我的问题是附加它。由于主要代码查询“story_data” - 现在..我可以让方法查询搜索story_data和story_data2并使用偏好在两者之间切换。如果这有意义的话。
  • @DavidMedenjak 我现在就试一试。

标签: android sqlite android-sqlite


【解决方案1】:

就地更新所有行需要数据库移动大量数据。
如果可能,请先删除所有旧行,然后插入所有新行。

最快的方法是避免使用文本文件:将新数据作为数据库文件发送,ATTACH 将更新文件发送到主数据库,然后在单个语句中复制数据,如下所示:

INSERT INTO main.Story_Data(ID, text2) SELECT ID, text2 FROM updateDB.Story_Data;

【讨论】:

  • 谢谢。这奏效了……几乎是立即的。但是,我有一个问题......原始表还有其他几列。所有这些都保持不变。 ID、章节、text1、text2(为空白)。当我从只有文本(没有 id)的新数据库中复制时,它只是在 34500 之后追加,而不是进入 text1 旁边的实际列(我想保留两个文本)。
  • 你别无选择,只能更新。或者,使用两个始终连接的表。
  • 我很接近,如果您有任何建议。以下命令有效,只是所有行都相同。 UPDATE Story_Data set text2 = (SELECT text FROM updateDB.Story_Data)
猜你喜欢
  • 1970-01-01
  • 2021-07-24
  • 1970-01-01
  • 1970-01-01
  • 2016-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多