关于从Android访问远程SQL Server的几个问题

时间:2013-05-17 06:16:10

标签: android sql-server sqlite


我有一个应用程序,我们需要使用选项卡进行数据输入。该选项卡从远程服务器加载初始数据。随后,当用户在选项卡上插入/更新数据时,需要更新,插入远程服务器(用于新数据)。 Out数据库服务器是SQL Server 2008 正如stackoverflow的许多专家所建议的那样,我们将在服务器上使用Webservices来促进数据交换。但是我仍然不确定以下几点 -
1.在这种情况下,最好的认证机制是什么 2.我应该从android中的sqlite表中获取一大块数据,转换为JSON并将其传递给Webservices以进行插入/更新操作,或者进行单行更新。虽然我认为发送单行不会有效 3.如何管理升级远程服务器失败。如果我使用单行,这会更容易。我的计划是将sqlite记录的状态标志设置为1(默认为0),以便更新/插入到远程服务器的记录。如果更新/插入失败,我将状态标志更改回0,以便下次再次使用它们。如果成功,将标志更改为2。


提前谢谢

UPDATE
Doen一些研究并尝试使用SampleSyncAdapter。关于整个行动仍然存在一些困惑。我的Sqlite数据库是由该应用程序中存在的程序和内容提供程序类创建的。应用程序的包名称是com.xylo.pds。我正在尝试编写一个同步应用程序,它试图同步第一个应用程序中使用的数据。如果我按照SampleSyncAdapter示例 - 我需要开发服务器端应用程序进行身份验证,然后将android数据上传到服务器(在我的情况下,一种方法就足够了)。我可以借助样本提供的服务器端代码来做到这一点。 所以我只是为我的身份验证和同步复制了示例代码的代码。我的authenticator.xml有现有的条目 -    android:contentAuthority="com.android.contacts" android:accountType="com.example.android.samplesync

所以现在我的应用程序可以添加帐户并同步联系人。并且难怪它适用于样本给出的虚拟服务器ID。
 现在我需要将自己的代码放在应用程序中,以便我可以将本地数据库加载到服务器。为此,我需要在SyncAdapter的onPerformSync上添加代码。为了使用现有的ContentProvider,我在清单文件中有以下条目 <uses-permission android:name="com.xylo.pds.RCDataProvider" />。定义ContentProvider的应用程序具有以下条目 -
<provider android:name=".RCDataProvider" android:authorities="com.xylo.pds.provider" android:exported="true" android:readPermission="android.permission.permRead" />
现在,如果我在SyncAdapter中添加了对contentresolver的调用,保持其他所有内容相同,只是为了检查一切正常。所以,没关系,我可以更改onPerformSync来添加上传数据的代码。但是现在应用程序会停止sysnc联系人。我错过了什么 请赐教。谢谢

2 个答案:

答案 0 :(得分:0)

  1. a)您可以要求用户从移动应用程序登录/注册,就像您对网站所做的那样。 b)看看这个http://android-developers.blogspot.ro/2013/01/verifying-back-end-calls-from-android.html

  2. 在同一个请求中发送更多记录,其目的是尽可能少地提出请求。

  3. 我认为您不应该将错误标志与默认值保持一致,它应该是不同的值,以便您能够更轻松地处理它。

答案 1 :(得分:0)

  

1)在这种情况下,最好的身份验证机制是什么。

您可以/应该使用OAuth2。要么在Web服务网站上实现您自己的令牌,要么将常见的OAuth2 Web服务与Android帐户管理器结合使用。

建议采用这种方法的原因实际上取决于根据Google文档处理用户身份验证的建议/推荐方式。 请在此处http://developer.android.com/training/id-auth/identify.html

查看“记住您的用户”

这可以很好地解决您的下一个问题

  

2)我应该从android的sqlite表中获取一大块数据,转换为JSON并将其传递给Webservices以进行插入/更新操作   或采取单行和更新。虽然我认为发送单行会   不高效。

你应该使用android同步适配器,它将利用我在回答问题1时给你的链接中描述的客户经理功能

您可以以任何方式编写Android服务代码,但您应该在两个方向上使用JSON而不是XML。

将帐户管理器与同步适配器一起使用的真正好处是,您的SQLite内容提供程序方法可以使用notifyChange方法告诉同步适配器更新Web服务。

您可以告诉同步适配器同时从您的网络服务获取最新数据,或者您可以安排同步。

  

3)我如何管理升级远程服务器的失败。如果我使用单行,这会更容易。我的计划是为sqlite设置状态标志   更新/插入的记录的记录为1(默认值为0)   远程服务器。如果更新/插入失败,我将状态标志更改回   0这样我下次就可以再次使用它们了。如果成功改变   2的旗帜。

这是由Virgil在Google I / O视频中解释的,嵌入到此同步适配器教程中https://sites.google.com/site/andsamples/concept-of-syncadapter-androidcontentabstractthreadedsyncadapter

使用同步适配器从您的网络服务获取数据的另一种解决方案是使用GCM(Google云消息传递服务。http://developer.android.com/google/gcm/gs.html

基本上,帐户管理员/同步适配器/ gcm是Android建议您使用的功能,这些是Google将自己用于GMail等服务的服务,并且即使在清除数据或卸载数据后,您的用户也可以保持数据的完整性应用程序和重新安装应用程序,它还允许用户能够在新手机上安装应用程序并保留他们的数据。

希望有所帮助

更新以回应评论

您应该尽力减少在任一方向上发送的数据的流量和大小。我会在一个单独的JSON请求中发送全部内容。 您的Web服务器应该能够自动处理gzip压缩请求,如果您的服务器上没有安装gzip,那么添加它就足够了

可以在此处找到有关从应用创建gzip压缩输出流的参考 http://developer.android.com/reference/java/util/zip/GZIPOutputStream.html

对于Web服务器,您需要的解决方案取决于您使用的服务器,您应该向主机查询有关gzip的信息,但这里有一些最流行的Web服务器的链接

Apache - http://howtounix.info/howto/Apache-gzip-compression-with-mod_deflate NGinx教程 - http://www.howtoforge.com/how-to-save-traffic-with-nginxs-httpgzipmodule-debian-squeeze

GZip是最受欢迎的Web服务器解决方案,实现起来非常简单。

我没有足够的信息来提供更多的建议,除了说我通常使用Ruby on Rails这样的东西,gzip使用类似于这个{{{a}的ative支持gzip库非常简单地处理1}}

更新2 notifyChange()

由于没有互联网访问权限,您只能了解有关notifyChange不适合内容提供商的观点。

在内容提供商中使用notifyChange()是可以的,因为它会告诉同步适配器在适当的时候立即更新,这意味着当设备不是太忙而且只要互联网连接变为可用。这就是同步适配器的重点。您是否需要在内容提供程序中使用notifyChange以获取其他服务(例如数组适配器),但是您不希望告知同步适配器更新,那么可以添加一些文档的布尔参数,您可以将其添加到notifyChange的末尾参数列表。将其设置为false,内容提供者将忽略notifyChange

e.g。而不是通常contacts = ActiveSupport::JSON.decode(gzipped_contacts.gsub("+", ""))您可以使用getContext().getContentResolver().notifyChange(uri, null);