2013-02-02 25 views
1

我想開發一個將使用外部創建的SQLite數據庫的Android應用程序。 所需施用操作循環如下:如何用每日例行外部創建的新SQlite數據庫替換Android SQlite數據庫?

  1. 數據庫重新創建和常規 (每天)的基礎上與所述外部(Windows桌面)計算機上的數據(從另一 數據庫)填充。
  2. 該數據庫然後通過USB或WIFI推送到Android設備。
  3. 新推送的數據庫用於在Android設備上輸入新數據。輸入的記錄被標記(以區別 與現有記錄)。
  4. 在一天結束時,數據庫從Android設備回到Windows桌面計算機(此過程需要由Windows應用程序啓動,而不是由Android應用程序啓動)爲 。
  5. 新的(標記的)記錄是從Windows桌面上的SQLite數據庫中提取的,並經過驗證並添加到主要的Windows桌面數據庫中。
  6. 然後將更新後的完整桌面數據庫複製到新的SQLite數據庫中,最終將數據庫推回到Android設備中(請參見第1點和第2點)。

注:

  1. 列表項
  2. SQLite數據庫無法在Android設備上通過Android應用程序創建的。
  3. 將外部創建並填充的數據庫放置在apk中的資產目錄中是不可行的,因爲這隻適用於初始應用程序安裝,並且不符合日常數據庫推/拉例程的關鍵要求。
  4. 從Web服務器存儲/導入SQLite數據庫是不可行的,因爲用戶在使用此應用程序時通常無法訪問互聯網,即需要在Android上連接SQLite數據庫推/拉過程通過USB或WIFI連接到獨立的Windows機器。
  5. 優先考慮的是從Android內部存儲區域(或SDCard)存儲和訪問數據庫,但在隱藏/受保護的內部根存儲部分之外,即不在/ data/data/package_name/databases /中爲用戶提供對Android設備上存儲的數據庫文件的免費訪問。
  6. 關鍵障礙似乎是Android應用程序對外部創建的推送數據庫的識別。我已經通過將應用程序創建的數據庫文件複製到另一個文件夾(仍在data/package_name/.. root部分中)然後將其複製回../databases/文件夾來測試它。這足以破壞應用程序對數據庫的訪問:儘管試圖打開相同的未更改的數據庫文件,但我會得到一個「打開跟蹤文件時出錯:沒有這樣的文件或目錄(2)」。我認爲,這個限制是由於Android的「沙盒」文件安全保護?

如何克服上述數據庫複製/推/拉問題以及如何實現這個所需的數據庫訪問推/拉模型?

回答

1

如果您需要USB,ADB將爲您做到這一點。

adb push <local db> <android db> 

adb pull <android db> <local db> 

例如:

adb push database.db /sdcard/mypath/database.db 
adb push /sdcard/mypath/database.db database.db 

您也可以在Windows機器從Android設備中刪除數據庫,就像這樣:

adb shell rm /sdcard/mypath/database.db 

此外,還可以使用ADB啓動活動或廣播意圖,以便您可以告訴應用程序關閉數據庫,然後退出數據庫。

如果無線網絡連接的選項(更好的選擇),也有不同的方式通過WiFi訪問Android設備上的數據:

  • NanoHTTPd轉動設備到只使用一個單一的java文件一個Web服務器。
  • jCIFS讓Android設備訪問Windows共享。
+0

非常感謝您關於adb使用的注意事項。很有幫助。 –

+0

非常感謝你關於adb使用的注意事項。很有幫助。但是,我的主要問題有兩個:1.如何訪問由Windows桌面上adb推送的外部創建的數據庫,並讓我的應用程序將其識別爲合法的sqlite數據庫源。 2.如何將默認數據庫目錄從root/data/data/package_name/databases /更改爲公共的,用戶可訪問的Android目錄,例如/ sdcard /?預先感謝您提出如何實現上述建議。 –

+0

P.S.我知道必須能夠避免Android「沙箱」限制,因爲我已經看到一個應用程序正在做這件事(請參閱_ ** https://play.google.com/store/apps/details?id=com。 blackhillock.livestock&hl = en)_ ** –