2011-11-18 32 views
1

我製作了一個iphone應用程序,它使用了一個預先填寫了問題/答案的SQLite數據庫。每次我想更正/添加問題到數據庫時,我都必須更新應用程序並將其提交給Apple。我剛剛開始瞭解一些JAX-RS API,並且已經提出了REST的問題等,並將它們公開爲XML。所以我現在想要的是使用網絡中的數據而不是固定的數據庫,但我有一些問題:製作移動應用程序中的內容動態

  • REST和我描述的方式是「有效」的方式嗎?
  • 我需要離線提供的問題,所以我想下載 文件到設備,並定期檢查是否有新文件是 avalible並下載。

也許愚蠢的問題,但我沒有,所以我任何幫助和思緒之中將大大appriciated做過很多Web服務:=)

+0

如果我理解正確,應用程序「Exoplanet」解決您的問題的方式是,只要包含行星的文檔(在您的情況下,您的Q/A)就會在應用程序頂部彈出小紅點警報,變化。然後,應用程序知道它應該去獲取它,並將內容存儲在手機SQLite數據庫中。 – Kheldar

回答

0
  • 你需要有一個數據庫(在數據庫中讀出:「A大量的數據以任何你喜歡的方式存儲,不管是純文本,xml還是sql),都可以在服務器上存儲你的問題。
  • 你需要有一個接口來查詢這些問題。
    • 一個簡單的(但不是非常優化的)想法是,以xml格式存儲該數據庫,並定期(或通過用戶輸入)使應用程序抓住該XML並解析它。
    • 一個更復雜,更好的方法是讓應用程序說出最後一次檢索問題的時間,並只提供一個帶有差異的xml。
    • 你的REST方法很好,可能是我上面描述的方法之一(你使用REST以「簡單」或「更復雜」的方式返回它,但如果你不需要任何認證,你可能會不想所有的開銷。最後,這是給你和你的需求。
  • 解析該文件(我使用XML作爲例子,但可以使用JSON,CSV,等等)
  • 商店設備中的數據
    • 如果您使用的是「簡單」方法,則可以使用xml擦除整個數據庫並重新創建該數據庫
    • 如果您使用了「更加複雜」的方法,你應該只添加你所得到的,因爲你的服務器應該只提供了新的問題

陷阱:

  • 數據庫需求不在應用程序包內,否則將無法寫入(只能在模擬器上寫入,而不能在設備上寫入)
  • 您應該仔細考慮如何將這些問題存儲在設備上(如果它是一個僅適用於iOS的應用程序,我推薦CoreData)

如果您想在應用程序圖標(稱爲「徽章」)中顯示帶有數字的「紅球」(在這種情況下爲更新次數),您應該使用通知,需要在您的站點數據庫中註冊客戶端標識符,並且每次有更新時,都應通知每個客戶端。這不是微不足道的,我相信你應該首先實施解決方案,讓應用程序在反方向前搜索數據。

如果您想了解更多有關通知,你可以使用:

請注意,這不是一成不變的。還有其他方法(應該是),但這是我在需要更新客戶端數據庫時使用的工作流程。

希望它指出你在正確的方向。隨意要求澄清(如果需要)。

0

所以答案:

是的,這是工作的好方法,你可以使用網絡上傳最新 數據。你可以用兩種方法做:

1)只上傳新問題,並將它們添加到現有的sqlite 數據庫爲您的應用程序。但是您應該知道,數據庫 必須放置在Documents目錄中,而不是您的應用程序 Bundle中。示例代碼,你可以在這裏查看。

 BOOL success; 
     NSFileManager *fileManager = [NSFileManager defaultManager]; 
     NSError *error; 
     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
     NSString *documentsDirectory = [paths objectAtIndex:0]; 
     NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"db.sqlite"]; 
     self.imagesPath = [documentsDirectory stringByAppendingPathComponent:@"images"]; 

//Check if you have local copy of your database 
     if (![fileManager fileExistsAtPath:imagesPath]) 
     { 
     NSError *error; 
      if (![fileManager createDirectoryAtPath:imagesPath withIntermediateDirectories:YES 
          attributes:NULL error:&error]) 
      { 
       NSAssert1(0, @"Error cannot create a directory %@", imagesPath); 
      } 
     } 



success = [fileManager fileExistsAtPath:writableDBPath]; 

//If you have no local copy, than copy default database, which you have added to project 
//Instead of this you can also download database from internet.  
     if (!success) 
     { 
      // The writable database does not exist, so copy the default to the appropriate location. 
      NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"db.sqlite"]; 
      success = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error]; 
      if (!success) { 
       NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]); 
      } 
     } 

2)你可以下載整個sqlite數據庫並替換現有的。它很容易,但請記住,在這種情況下,您應該使用更多的流量。

  • 是的,只是存儲在本地數據庫中的文件目錄,當你需要
    更新。
相關問題