2013-05-17 94 views
1


我有一個應用程序,我們需要使用一個選項卡進行數據輸入。該選項卡從遠程服務器加載初始數據。隨後,當用戶在選項卡上插入/更新數據時,遠程服務器需要更新,插入(用於新數據)。 Out數據庫服務器是SQL Server 2008.
正如許多stackoverflow專家所建議的,我們將在服務器上使用Webservices以促進數據交換。不過,我仍然不確定以下幾點 -
1.什麼是在這種情況下驗證的最佳機制。
2.我應該從android中的sqlite表中獲取大量數據,轉換爲JSON並將其傳遞給Webservices以進行插入/更新操作或進行單行更新。雖然我認爲發單行將不會有效。
3.如何管理升級遠程服務器失敗。如果我使用單排,這很容易。我的計劃是將sqlite記錄的狀態標誌設置爲1(默認值爲0),以便更新/插入到遠程服務器的記錄。如果更新/插入失敗,我將狀態標誌更改爲0,以便下次再次使用它們。在成功的情況下更改標誌2.關於從Android訪問遠程SQL Server的一些問題


由於事先

UPDATE
DOEN一些研究,並試圖用SampleSyncAdapter。整個操作仍然存在一些混亂。我的Sqlite數據庫是由該應用程序中存在的程序和內容提供者類創建的。該應用程序的軟件包名稱是com.xylo.pds。我試圖編寫一個同步應用程序,它嘗試同步第一個應用程序中使用的數據。如果我遵循SampleSyncAdapter示例 - 我需要開發服務器端應用程序進行身份驗證,然後將android數據上傳到服務器(在我的情況下,有一種方法就足夠了)。我可以在示例中給出的服務器端代碼的幫助下做到這一點。 所以我只是複製我的身份驗證和同步的示例代碼的代碼。我authenticator.xml具有現有entries- 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聯繫人。我缺少的東西 請賜教。謝謝

+0

我錯了。 '因此,內容管理機構指定哪個內容提供者將在本地進行同步,並且accountType指定將使用哪個認證者來遠程訪問數據。 accountType還用於獲取同步適配器的特定內容-uri。'可用[這裏](http://stackoverflow.com/questions/8525721/what-are-android-syncadapter-contentauthority-and-accounttype)救了我的一天。 – Dibs

回答

0

1)什麼對這種情況下的認證的最佳機構。

你可以/應該使用的OAuth2。要麼在Web服務網站上實現您自己的令牌,要麼與Android帳戶管理器一起使用常見的OAuth2 Web服務。

之所以建議這種做法實在是下降到處理用戶身份驗證的每谷歌文檔的建議/推薦的方式。 見「記住你的用戶」在這裏http://developer.android.com/training/id-auth/identify.html

這很好地引導到你的下一個

2)我應該採取在機器人從SQLite表數據塊的問題,轉換成JSON,並把它傳給用於插入/更新操作的Web服務 或採取單行更新。雖然我認爲發單行 效率不高。

您應該使用Android同步適配器,它會利用在鏈路中描述的帳戶管理器功能,我給你在回答問題1

你可以在你希望的任何方式編寫你的Android服務,但你應該在兩個方向上使用JSON而不是XML。

有關使用客戶經理與同步適配器的真正美妙的事情是,你的SQLite的內容提供商的方法可以使用有NotifyChange方法來告訴同步適配器更新Web服務。

你可以告訴同步適配器在同一時間獲得來自Web服務的最新數據,也可以安排同步。

3)如何管理升級失敗遠程服務器。如果我使用單排,這很容易。我的計劃是爲sqlite的 記錄狀態標誌設置爲1(默認爲0)記錄更新/插入 遠程服務器。如果更新/插入失敗,我將狀態標誌更改回 0,以便下次再次使用它們。在成功變化 所述標誌的情況下,以2

這是通過在維吉爾包埋入到該同步適配器教程谷歌I/O視頻解釋https://sites.google.com/site/andsamples/concept-of-syncadapter-androidcontentabstractthreadedsyncadapter

的替代解決方案使用同步適配器來從您的Web服務獲取數據將使用GCM(谷歌雲消息服務)http://developer.android.com/google/gcm/gs.html

基本上帳戶管理器/同步適配器/ gcm是Android建議您使用的功能,這些是Google使用自己的服務像GMail一樣,並讓用戶有能力保持即使在清除數據或卸載應用程序並重新安裝應用程序之後,其數據仍然完好無損,並且還允許用戶能夠在新手機上安裝應用程序並保留其數據。

希望幫助

UPDATE響應意見

你應該總是儘量減少流量和數據的大小在兩個方向上被髮送。我會發送整個單一的JSON請求gzipped。 您的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與使用類似於此contacts = ActiveSupport::JSON.decode(gzipped_contacts.gsub("+", ""))東西ative支持gzip庫處理的非常簡單

更新2有NotifyChange()

只需在您的大約有NotifyChange不是在內容提供適當的點拿起由於那裏是沒有互聯網接入。

在您的內容提供商中使用notifyChange()會很好,因爲它會告訴同步適配器在適當時進行更新,這意味着當設備不是太忙時,並且只要互聯網連接變得可用。這是同步適配器的重點。如果您需要在內容提供者中使用notifyChange來訪問其他服務(如陣列適配器),但不希望同步適配器被告知需要更新,那麼會有一些記錄的布爾參數,您可以將其添加到notifyChange的末尾參數列表。將其設置爲假,並且內容提供商將忽略通知更改

例如,而不是通常的getContext().getContentResolver().notifyChange(uri, null);您可以使用getContext().getContentResolver().notifyChange(uri, null, false);

+0

因爲這不會是連接,而數據捕獲notifyChange不是我的選擇。所以我需要在用戶準備好時進行同步。現在我明白了,SyncAdapter也明白我需要爲onPerformSync函數定製同步操作。在這一點上,每個WebService調用的記錄數問題就來了。由於我可能有很多可用於同步的記錄,因此我需要找出每個呼叫的最佳有效負載。對此有何建議? – Dibs

+0

@Dibs我已經更新了我的答案。希望能幫助到你 – jamesc