gpt4 book ai didi

android - 在 Android 上将 SQL 数据库与 REST 远程服务器同步的最佳实践

转载 作者:IT王子 更新时间:2023-10-29 06:22:58 25 4
gpt4 key购买 nike

我有一个自定义的 Android ContentProvider,它可以从 SQLite 数据库中存储和检索数据。

假设其中一个数据库表有一个 _ID 列和一个 NAME 列以及如下内容:

|==========|==========|
| _ID | NAME |
|==========|==========|
| 1 | d1 |
| 2 | d2 |
| 3 | d3 |
| 4 | d4 |
|==========|==========|

此 SQLite 数据库与远程数据库保持同步,并通过网络定期获取新数据。可能对表进行的操作如下:

  1. 可以删除现有行
  2. 可以添加新行
  3. 可以修改现有行的 NAME 列

现在让我们假设所有可能的操作同时发生,并且在从远程服务器获取一些最新数据之后,该表的新内容必须设置如下:

|==========|==========|
| _ID | NAME |
|==========|==========|
| 1 | d7 |
| 3 | d3 |
| 4 | d6 |
| 5 | d5 |
|==========|==========|

可以有两种不同的方法来做到这一点:

  1. 查询数据库并检查每个现有行以查看它们是否需要更新,然后添加任何新行并删除任何缺失的行 - 尽管如果我们想使用分页更新数据库,此方法可能有点棘手方法而不是使用单个网络获取
  2. 使用单个 DELETE SQL 命令删除整个表,然后添加从服务器接收的所有行

在 Android 上,我目前正在使用 批处理 实现第二种方法以最大化性能:

final ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>();

// with this URI, the content provider deletes all rows
operations.add(ContentProviderOperation.newDelete(Users.CONTENT_URI).build());

final ContentValues values = new ContentValues();
values.put(ID_COLUMN, 1);
values.put(NAME_COLUMN, "d7");
values.put(ID_COLUMN, 3);
values.put(NAME_COLUMN, "d3");
values.put(ID_COLUMN, 4);
values.put(NAME_COLUMN, "d6");
values.put(ID_COLUMN, 5);
values.put(NAME_COLUMN, "d5");

operations.add(ContentProviderOperation.newInsert(Users.CONTENT_URI).withValues(values).build());

getApplicationContext().getContentResolver().applyBatch(MyContentProvider.AUTHORITY, operations);

这是最好的方法,还是方法 1(或其他方法)在性能方面会更好?

编辑:例如,采用方法 2,使用数据库事务的覆盖 ContentProvider#bulkInsert 可以大大加快批量插入操作:参见 this question .

最佳答案

最佳选择需要适当的 API 实现 - 当您应该存储一些 db_version(上次更新的 int 或时间戳,或其他)。

在更新期间,服务器响应数据和操作类型 - 添加、更新、删除。

关于android - 在 Android 上将 SQL 数据库与 REST 远程服务器同步的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9565400/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com