首页 > 解决方案 > 如何为离线支持构建 SQLite 数据库?

问题描述

我正在尝试在我的应用程序中提供离线支持,因此用户也可以在没有互联网的情况下阅读信息。我正在创建一个应用程序来显示来自不同公司的一些包。我已经在远程服务器中创建了我的 API 和以下数据库。

companies -- id, name
duration-- id, type (type could be, monthly, weekly, yearly)
packages -- id, name, company_id, duration_id 

我的 API 返回结果为

{  
   "id":3,
   "package":"premimum",
   "company_id":6,
   "duration_id": 5,
}

现在我想将从 API 获取的所有信息存储到本地数据库 SQLite。现在我想知道我应该如何构建我的本地数据库?我的结构应该与远程数据库相同吗?我应该在本地数据库SQLite中创建三个表一样吗?

companies -- id, name
duration-- id, type (type mean package duration, monthly, yearly, daily)
packages -- id, name, company_id, duration_id 

如果是,那么id在本地数据库和远程数据库中会有所不同,因为两个数据库都会生成自己的primary key我该如何处理?或者你可以建议我保持相同的ID?还是我应该保持id不同?

标签: androidsqliteandroid-room

解决方案


您不一定需要本地数据库上的内部 ID 来匹配云服务器数据库的内部 ID。例如,如果您使用 Parse 作为云服务器,Parse 将生成自己的内部对象 ID。您的应用不需要知道它们。

话虽如此,我强烈建议您在本地对象和云对象之间有一个共同的关键属性,以便您可以保持它们同步。

例如,您可以package_id在本地和云对象上添加一个属性。这package_id在双方都是相同的,因此您可以在更新远程对象时更新本地对象,反之亦然。

例如,下面是在 Parse 服务器上创建对象的代码:

ParseObject gameScore = new ParseObject("GameScore");
gameScore.put("score", 1337);
gameScore.put("playerName", "Sean Plott");
gameScore.put("cheatMode", false);
gameScore.saveInBackground();

您可以让他们从应用程序中检索此对象,如下所示:

ParseQuery<ParseObject> query = ParseQuery.getQuery("GameScore");
query.getInBackground("xWMyZ4YEGZ", new GetCallback<ParseObject>() {
  public void done(ParseObject object, ParseException e) {
    if (e == null) {
      // object will be your game score
      int score = object.getInt("score");
      String playerName = object.getString("playerName");
      boolean cheatMode = object.getBoolean("cheatMode");
    } else {
      // something went wrong
    }
  }
});

我建议您阅读文档以获取有关在 Parse 服务器上存储对象的更多信息: https ://docs.parseplatform.org/android/guide/

此外,此库可以帮助您在本地数据库和 Parse 服务器之间同步数据: https ://github.com/ntoskrnl/DataSync


推荐阅读