【问题标题】:Android - update client' sqlite database using GCMAndroid - 使用 GCM 更新客户端的 sqlite 数据库
【发布时间】:2013-12-14 16:27:50
【问题描述】:

我正在开发一个带有 SQLite 数据库的 android 应用程序。我想实现以下功能:

  • 当有新数据可用时,客户端的应用程序会自动将新数据下载到其 sqlite 数据库中。

我阅读了很多相关的帖子,很多人建议 GCM 是通过创建 GCM 服务器向客户端设备发送通知来实现此类功能的最佳方法。例如,this tutorial

但是,它只是在客户端的应用程序上显示 GCM 服务器发送的消息。为了从服务器更新客户端的 sqlite 数据库,GCM 服务器应该发送什么? (发送sql更新命令?)

提前致谢!

================================================ ==============

编辑:

我现阶段所知道的: GCM 服务器通知客户端有新的更新,然后客户端调用 Web 服务来获取数据并插入到其 sqlite 数据库中。

问题:编写这样的网络服务的方法是什么?如何将客户端应用程序的数据库与我的服务器同步?

【问题讨论】:

    标签: android android-sqlite google-cloud-messaging


    【解决方案1】:

    GCM 服务器不负责更新你的数据库,你可以用它来暗示你的应用,哟!我的服务器上有一些新东西要更新,让我们连接并下载新数据。它可以节省大量设备电池电量,您会浪费在内部某个定义的时间将服务器池化以检查更新的可用性。

    您可以为您从 GCM 发送到您的应用的 json 消息指定一个键值对,例如
    { “状态”:“新更新” }

    在 GCMReceiver 的 onMessage() 中,您可以通过意图中的“状态”键获取消息并编写类似的逻辑

    if(message.equalsIgnoreCase("newupdate"){
    
     //Call a service and download the data and store/update in your databse 
    
    }
    

    如果您是 Sqlite 数据库的新手,请阅读本教程 http://www.vogella.com/articles/AndroidSQLite/article.html

    考虑到你已经实现了他的 OpenHelper 类来更新数据库

     MyOpenHelper myOpenHelper= new MyOpenHelper(this)
     sqltitedatabaseObject=myOpenHelper.getWritableDatabase();
     ContentValues values = new ContentValues();
     values.put(<your_column_name>,<value>);
    
    // For Updating the Existing Entry
    long rowAffected=sqltitedatabaseObject.updateWithOnConflict(<Table_Name>,
                values,<Selection_For_Update>,<Selection_Paramans_In_String_Array>,
                0);
    // For Inserting a New Row
            long rowsInserted=sqltitedatabaseObject.insert(<Table_Name>, null, values);
    

    根据您的编辑,让我补充几点:

    1. 同步意味着保持两个数据相同,为了实现这一点,您必须创建一个 Web 服务,该服务将从您的数据库中获取数据(为插入数据库中的每个数据添加时间戳并将其与数据一起发送您正在发送到设备)。

    2. 同步数据时,从设备 sqlite 数据库中获取时间戳的最大值,并在从设备访问 Web 服务时作为参数发送,并从服务器发送数据作为响应,这些数据在特定之后添加或更新请求中收到的时间戳。

    因此,即使用户删除了您的应用,您也不会在请求时间戳中得到任何信息,因此发送整个数据。

    【讨论】:

    • 你的意思是我应该创建一个提供 json 数据的 RESTful 服务?如果是这样,假设有两条新记录可用,我将它添加到我的服务器数据库中,但服务应该如何返回这两条记录? (在表中定义一列以标识“这是新的”?)
    • 在restful服务中你可以决定你想要的格式,可以是xml,json或者简单的字符串,如果为了你方便的话。我说的JSON是GCM推送消息中的JSON来识别消息如果您想要来自 GCM 的多个通知。直到 4KB 的数据,您可以在有效负载中传递 GCM 消息本身,但如果您有更大的数据,请创建一个 Restful Web 服务并告诉您的应用程序使用它下载数据。
    • 时间戳的作用是什么?
    • 了解设备中已经存在但未在服务器上更新的所有数据。它将提高应用程序的性能。您需要发送设备中已经存在的数据。像 roe 一样,只有更新的数据才会在设备上发送。每次更新行时更新时间戳。
    • @user2761885 如果您得到谁提出的问题的答案,请接受答案。它可以帮助他人。
    【解决方案2】:

    发送一条sql更新命令?

    不,您应该发送 Json 数据,形成您的服务器,然后在您的 GCMIntentReciever 中的 onMessage() 中,您将获得相同的 json 数据。将此 json 数据解析为某个对象并执行插入查询..

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-28
      • 2018-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多