【问题标题】:How structure a SQLite database for offline support?如何为离线支持构建 SQLite 数据库?
【发布时间】:2019-03-21 14:07:37
【问题描述】:

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

【问题讨论】:

    标签: android sqlite android-room


    【解决方案1】:

    您不一定需要本地数据库上的内部 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

    【讨论】:

    • 通用键属性?你能分享任何例子吗?我怎样才能同步它们?我是第一次尝试,所以我不知道如何实施,什么是最佳实践等等。这完全是第一次。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多