将新数据保存到另一个领域数据库并替换当前数据

时间:2018-08-09 13:19:56

标签: android realm

现状

在我的应用程序中,我使用realm database方法并从下载的insert实例化了JsonReader的情况下,将大约100Mb的数据保存到默认的json file中。

现在:一切正常,但是仅用于解析保存操作,就需要花费几分钟(在2到5之间)保存该数据量。 (我使用OKHTTP下载json文件-.txt-和InputStream-> JsonReader-> Gson-> realm.insert进行解析-插入操作)

可能的改进思路

由于在我的应用程序逻辑中,此操作也可能在后台线程上完成,因此我在徘徊,是否可以执行以下操作:

  1. 从互联网异步下载数据
  2. 将数据保存到new realm database
  3. 完成后,提示用户更新数据
  4. 从新数据库中获取一些表,然后通过批量删除插入将它们放入旧表中(我不在乎丢失那些表的旧数据,新表始终是正确的,用户不能编辑它们。)

该实现可能存在的问题

我对这个解决方案的开发很满意,但是在执行这样的重构操作之前,我有两个问题:

  1. 我可以在database2中对background thread执行保存操作,并让用户在UI上使用database1main thread还是两个数据库在database2 insert操作期间被锁定?
  2. 如果我当前的数据库使用default configurations,是否可以仅通过传递一个不同的数据库名称而使用custom configurations创建另一个领域数据库?

这是我要进行的最终替换操作的内容(当然,这只是一个示例,请从中删除概念):

Realm oldRealm = Realm.getDefaultInstance();
Realm newRealm = Realm.getInstance(secondConfig);

//assume it's inside a transaction
oldRealm.delete(mytable.class);
oldRealm.insert(newRealm.where(myTable.class).findAll());

关于此:

  • 这是一个可行的解决方案吗?
  • 与使用JsonReader下载和插入相比,此解决方案会更快吗?
  • 有更好的方法吗?

感谢所有人,对您的帖子过长/英语不好

编辑

我的下载保存代码(简化。我同步下载+-30个文件,并将它们保存到数据库中。最大的文件约为70Mb,而写入事务确实需要很多时间) :

我删除了无用的代码,只留下了相关部分。一直花费时间的行就是插入数据库。 我也尝试过不使用Gson,但自

以来我就需要它
//i'm inside an AsyncTask here
@Override
protected Void doInBackground(String... params) {
    Realm realm = null;
    try {
        realm = Realm.getDefaultInstance();

        String url = myDownloadFileURL;

        //here I download my files with OkHttp
        OkHttpClient client = new OkHttpClient.Builder()
                .connectTimeout(10, TimeUnit.SECONDS)
                .writeTimeout(600, TimeUnit.SECONDS)
                .readTimeout(600, TimeUnit.SECONDS)
                .retryOnConnectionFailure(true)
                .build();

        Request request = new Request.Builder().url(url)
                .addHeader("Content-Type", "application/json")
                .addHeader("Connection", "close")
                .build();
        Response response = client.newCall(request).execute();

        ResponseBody responseBody = response.body();

        if (responseBody == null) {
            return null;
        }

        // I save all my files into the internal storage because otherwise they will make the connection timeout
        File extStorageDirectory = Environment.getExternalStorageDirectory();
        File myFolder = new File(extStorageDirectory, BuildConfig.FLAVOR);
        myFolder.mkdirs();
        final File file = new File(myFolder, fileName + ".txt");
        FileOutputStream outputStream = new FileOutputStream(file);
        InputStream is = responseBody.byteStream();
        byte[] buffer = new byte[4096]; //Buffer size, Usually 1024-4096
        int len;
        while ((len = is.read(buffer, 0, buffer.length)) > 0) {
            outputStream.write(buffer, 0, len);
        }
        outputStream.flush();
        outputStream.close();

        responseBody.close();
        client.connectionPool().evictAll();

        //here I analyze my downloaded data and I save them to realm.
        //I put only one case, they are all the same :)
        switch (fileName) {
            case "Cities": {
                realm.executeTransaction(new Realm.Transaction() {
                    @Override
                    public void execute(Realm realm) {
                        try {
                           // {0} --> REFER BELOW
                        } catch (Exception error) {
                            //removed not useful code
                        }
                    }
                });
                break;
            }
            default:
                break;
        }
        response.close();

    } catch (IOException error) {
        //removed not useful code
    } finally {
        if (realm != null) {
            realm.close();
        }
    }
    return null;
}

@Override
protected void onPostExecute(Void v) {
    //removed not useful code
}

{0}->参考以下

对于那部分代码(缓慢的那部分),我尝试了很多方法。.那两种是性能和无错误抛出的最佳方法:

1)使用解析列表

Log.wtf("SYNC", "City - start delete");
realm.delete(City.class);
Log.wtf("SYNC", "City - end delete, start create");
BufferedReader reader = new BufferedReader(new FileReader(file));
realm.insert((List<City>) gson.fromJson(reader, new TypeToken<List<City>>(){}.getType()));
Log.wtf("SYNC", "City - end create");

2)使用JsonReader

Log.wtf("SYNC", "City - start delete");
realm.delete(Meter.class);
Log.wtf("SYNC", "City - end delete, start create");
InputStream is = new FileInputStream(file);
JsonReader jReader = new JsonReader(new InputStreamReader(is));
jReader.beginArray();
while (jReader.hasNext()) {
    realm.insert((City) gson.fromJson(jReader, City.class));
}
jReader.endArray();
jReader.close();
Log.wtf("SYNC", "City - end create");

在两种情况下,插入操作都相当长。

问题可能出在Gson,但是我需要解析我的模型,因为我有一些Date字段必须使用自定义typeAdapter进行解析。

0 个答案:

没有答案