如何為app 的 local database 備份 |
答題得分者是:aftcast
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
|
OneChen
初階會員 發表:7 回覆:33 積分:43 註冊:2014-03-27 發送簡訊給我 |
雖然 App 是在沙盒裡執行,但它仍然可以讀取特定的外部路徑,如:TPath.GetSharedDownloadsPath
請參考官方各平台路徑資料: http://docwiki.embarcadero.com/RADStudio/XE7/en/Standard_RTL_Path_Functions_across_the_Supported_Target_Platforms |
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
|
pcplayer99
尊榮會員 發表:146 回覆:790 積分:632 註冊:2003-01-21 發送簡訊給我 |
|
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
使用以下的路徑理論上是沒問題的。至於看不到這件事… 不用理它。重點是,你移除後,再次用這路徑來讀時,資料是否存在比較重要。
TPath.GetSharedDocumentsPath ===================引 用 P.D. 文 章=================== 我有試過 SHARED 的路徑, 可是很奇怪, 我可以操作複製, 但我進到該路徑下是看不到我複製的檔案, 這個問題由XE以來就一直困擾我!
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan |
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
我目前正是使用GetShareDocument, 但這個路徑仍然是在沙盒下, 並不是在 app 以外的位置
另外, 更正一點, 放在 GetShareDocument 下, 透過其他檔案管理的app是看得檔案, 也可以複製, 最早學習xe時, 接觸到的是 GetDocument 下, 可以讀取, 但看不到, 也無法拷貝 ===================引 用 aftcast 文 章=================== 使用以下的路徑理論上是沒問題的。至於看不到這件事… 不用理它。重點是,你移除後,再次用這路徑來讀時,資料是否存在比較重要。 TPath.GetSharedDocumentsPath ===================引 用 P.D. 文 章=================== 我有試過 SHARED 的路徑, 可是很奇怪, 我可以操作複製, 但我進到該路徑下是看不到我複製的檔案, 這個問題由XE以來就一直困擾我!
編輯記錄
P.D. 重新編輯於 2014-12-28 01:48:45, 註解 無‧
|
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
依android 官方的說法,它說,這個路徑是屬於 "外部" 的storage。但是,由於"外部"的實作每種手機不一定是一樣的。舉例說,有的手機支持外插 sd 卡,那麼這個path就會在sd上。有些手機沒有sd卡,而是自己會劃區塊 (好像硬碟可以劃區塊一樣),但劃出來的區塊也是屬於 "外部"。是故,外部 二字的意義不絕對是指 sd 卡,或是哪裡看得到。"外部"這個詞能確保的是: app 被移除時,他不會被刪除。至於位置在哪? 每隻手機不一樣。
External storage can be provided by physical media (such as an SD card), or by exposing a portion of internal storage through an emulation layer. Devices may contain multiple instances of external storage. ===================引 用 P.D. 文 章=================== 我目前正是使用GetShareDocument, 但這個路徑仍然是在沙盒下, 並不是在 app 以外的位置 另外, 更正一點, 放在 GetShareDocument 下, 透過其他檔案管理的app是看得檔案, 也可以複製, 最早學習xe時, 接觸到的是 GetDocument 下, 可以讀取, 但看不到, 也無法拷貝
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan |
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
感謝蕭大說明,
我實作把 TPath.GetShareDocumentPath 顯示出來如下 /storage/emulated/0/Android/data/com.embarcadero.project1/files 似乎 Share = files 那塊, 但它仍然在 com.embarcadero.project1 內, 所以當我移除app時, 一樣在 files(Share) 的檔案都會被移除, 這正是我的困擾, 使用的手機為 HTC 816, Samsung Galsxy J, 紅米, HTC 610, PAD(台製) 都是如出一轍~~ 其中, HTC 816 有裝 SD卡, 但查證 SD卡並無這個路徑 ===================引 用 aftcast 文 章=================== 依android 官方的說法,它說,這個路徑是屬於 "外部" 的storage。但是,由於"外部"的實作每種手機不一定是一樣的。舉例說,有的手機支持外插 sd 卡,那麼這個path就會在sd上。有些手機沒有sd卡,而是自己會劃區塊 (好像硬碟可以劃區塊一樣),但劃出來的區塊也是屬於 "外部"。是故,外部 二字的意義不絕對是指 sd 卡,或是哪裡看得到。"外部"這個詞能確保的是: app 被移除時,他不會被刪除。至於位置在哪? 每隻手機不一樣。 External storage can be provided by physical media (such as an SD card), or by exposing a portion of internal storage through an emulation layer. Devices may contain multiple instances of external storage. ===================引 用 P.D. 文 章=================== 我目前正是使用GetShareDocument, 但這個路徑仍然是在沙盒下, 並不是在 app 以外的位置 另外, 更正一點, 放在 GetShareDocument 下, 透過其他檔案管理的app是看得檔案, 也可以複製, 最早學習xe時, 接觸到的是 GetDocument 下, 可以讀取, 但看不到, 也無法拷貝 |
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
pd兄, 抱歉! 我直覺以為官網說的"概念性"都是正確的。不過…經你這麼說,我又去查了一下,似乎你說的是真的… 好像"外部"也有例外,待我花點時間深入後,再來回覆你。 sorry 啊~! :p
===================引 用 P.D. 文 章=================== 感謝蕭大說明, 我實作把 TPath.GetShareDocumentPath 顯示出來如下 /storage/emulated/0/Android/data/com.embarcadero.project1/files 似乎 Share = files 那塊, 但它仍然在 com.embarcadero.project1 內, 所以當我移除app時, 一樣在 files(Share) 的檔案都會被移除, 這正是我的困擾, 使用的手機為 HTC 816, Samsung Galsxy J, 紅米, HTC 610, PAD(台製) 都是如出一轍~~ 其中, HTC 816 有裝 SD卡, 但查證 SD卡並無這個路徑
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan |
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
深入一點去看,external 又被分為 public 與 private。我給你的是 私人的,也就是說真的app刪了就會刪。不過,說到這裡,你或許會想,那與 沒shared 的那個版本不是一樣嗎? 喔…我就是這樣大膽去猜才錯了。原來他們二個只差在… 權限。 一個不能被別人讀,一個可以。 但通通會被刪。
不會被刪的,看來就是 響鈴,照片,下載…等位置。但依這樣看來,最適合的大概就是 下載 區了。於是… 我想… onechen 開始說的那個 TPath.GetSharedDownloadsPath 是正解。 不然你測看看。 至於它的位置,一如我稍早講的,每隻手機可能會有不同的情形。但這次… 它不會被刪了 (不然就是官網的說詞出錯啦!,不會再錯吧…T_T )
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan
編輯記錄
aftcast 重新編輯於 2014-12-28 02:49:50, 註解 無‧
|
fred
一般會員 發表:14 回覆:40 積分:10 註冊:2002-06-15 發送簡訊給我 |
如果說database ,不能在程式員手上自由控管, 總覺的很不安全, 所以我就大膽的自設
var DataBaseDir, MyDB : string ; begin DatabaseDir := '/mnt/sdcard/RichAndFu' ; MyDB := DatabaseDir PathDelim 'RichFu.sd3' ; ....... end ; 在FDConnection1中BeforeConnect event 中, 如下列程式碼 dm.FDConnection1.Params.Values['Database'] := '/mnt/sdcard/RichAndFu' PathDelim 'RichFu.sd3' ; 就順利運行, 而且可以直接手動備份或複製, 不必操心database 被刪除, 就是有新版的apk要異動, 資料庫不會被異動或覆蓋 ========================== 在android SQLite 的databas 就只有單一個檔案, 備份可以不必用到Sqlite Backup , 直接複製更容易, 我提供我的方法 procedure TfrmMain.bBackUpClick(Sender: TObject); var NewLine , BackupPath, DestiPath: string ; begin NewLine := #$D#$A; BackupPath := '/mnt/sdcard/RichAndFu' PathDelim 'RichFu.sd3' ; DestiPath := '/mnt/sdcard/Download' PathDelim 'RichFu.sd3' ; MessageDlg('確定備份資料庫嗎?' NewLine '<' BackupPath '>', System.UITypes.TMsgDlgType.mtConfirmation , [ System.UITypes.TMsgDlgBtn.mbYes, System.UITypes.TMsgDlgBtn.mbNo ], 0, procedure(const AResult: TModalResult) begin if AResult = mrYES then begin try if TFile.Exists(DestiPath) then TFile.Delete(DestiPath); TFile.Copy(BackupPath,'/mnt/sdcard/download' PathDelim 'RichFu.sd3'); ShowMessage('備份成功'); except on e:Exception do begin ShowMessage(E.Message '備份失敗' ); end; end; end else if AResult = mrNo then exit ; end); end; |
aftcast
站務副站長 發表:81 回覆:1485 積分:1763 註冊:2002-11-21 發送簡訊給我 |
問題點是:
'/mnt/sdcard/xxxxxx ; 這個路徑不一定所有的手機都是一樣的。我查過,比如我的 galaxy nexus 4 沒那個。不過,重點是它有存照片等等的地方。 寫死那個path會出問題,盡管3星的不少都是那個,且3星賣不少。但也不能就這樣寫死… 是吧? ===================引 用 fred 文 章=================== 如果說database ,不能在程式員手上自由控管, 總覺的很不安全, 所以我就大膽的自設 var DataBaseDir, MyDB : string ; begin DatabaseDir := '/mnt/sdcard/RichAndFu' ; MyDB := DatabaseDir PathDelim 'RichFu.sd3' ; ....... end ; 在FDConnection1中BeforeConnect event 中, 如下列程式碼 dm.FDConnection1.Params.Values['Database'] := '/mnt/sdcard/RichAndFu' PathDelim 'RichFu.sd3' ; 就順利運行, 而且可以直接手動備份或複製, 不必操心database 被刪除, 就是有新版的apk要異動, 資料庫不會被異動或覆蓋
------
蕭沖 --All ideas are worthless unless implemented-- C++ Builder Delphi Taiwan G+ 社群 http://bit.ly/cbtaiwan |
fred
一般會員 發表:14 回覆:40 積分:10 註冊:2002-06-15 發送簡訊給我 |
如果不想寫死, 也很容易, 先用TDirectory 讀取所要的path, 細果放入listbox中,一層一層讀取, 選定後, 再把path, 存取記錄起來當作以後資料庫的path, 最好把 database structure 另外用程式寫, 我總覺 Database ,要能自己直接選取, 把它放在我們讀不到的路徑, 日後維護非當的不方便,
我提供大陸搜來的部份程式碼給大家應用 ===================== procedure MyExecSQL(ACon: TFDConnection; const ASQL: String); begin with TSQLiteStatement.Create(ACon.CliObj) do try Prepare(ASQL); Execute; while PrepareNextCommand do Execute; finally Free; end; end; ======================== var DataBaseDir, MyDB: string; sw: boolean; begin DataBaseDir := '/mnt/sdcard/RichAndFu'; // 這個就改成tDirectory 動態的變數, 就不會固定寫死了, Deploy 時, Database 就不要包進去,缷載時也不會被清除 MyDB := DataBaseDir PathDelim 'RichFu.sd3'; if not TDirectory.Exists(DataBaseDir) then begin try TDirectory.CreateDirectory(DataBaseDir); sw := TFile.Exists(MyDB); if not sw then begin FDConnection1.Params.Add('DriverID=SQLite'); FDConnection1.Params.Add('Database=' MyDB); FDConnection1.Connected := true; // { 创建一个名为 MyTable 的表, 字段包括: ID, Name, Age, Note, Picture } MyExecSQL(FDConnection1, 'CREATE TABLE Company(CompanyHead VARCHAR( 30 ), CompanyBoss VARCHAR(12), CompanyAddress VARCHAR(50), CompanyID CHAR(10), CompanyTel CHAR(20), CompanyMobile CHAR(10), CopyIMEI CHAR(15))' ); MyExecSQL(FDConnection1, 'CREATE TABLE Customer( custName VARCHAR( 20 ),custAddr VARCHAR( 50 ),custTel CHAR( 10 ),custMobile CHAR( 13 ), custMemo BLOB_TEXT)' ); // ShowMessage('資料建立成功'); end; except on e: Exception do begin ShowMessage(e.Message '資料建立失敗'); end; end; end; end; |
fred
一般會員 發表:14 回覆:40 積分:10 註冊:2002-06-15 發送簡訊給我 |
|
P.D.
版主 發表:603 回覆:4038 積分:3874 註冊:2006-10-31 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |