線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3418
推到 Plurk!
推到 Facebook!

如何為app 的 local database 備份

答題得分者是:aftcast
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#1 引用回覆 回覆 發表時間:2014-12-12 23:22:48 IP:118.169.xxx.xxx 未訂閱
請問各位!

如果我開發的app, 有使用 SQLITE 的資料庫在手機中, 由於Android 的架構是沙盒模式, 一旦移除app, 這些資料庫也都跟著被移除, 有沒有什麼可能性, 我可以把資料庫備份在手機其他地方, 當然如果我考量將 app 的資料上傳到其他網路位置是可以解決, 但我希望在沒有網路的環境下, 還做到備份功能!
OneChen
初階會員


發表:7
回覆:33
積分:43
註冊:2014-03-27

發送簡訊給我
#2 引用回覆 回覆 發表時間:2014-12-13 08:35:21 IP:175.181.xxx.xxx 訂閱
 雖然 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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2014-12-13 14:35:04 IP:118.169.xxx.xxx 未訂閱
我有試過 SHARED 的路徑, 可是很奇怪, 我可以操作複製, 但我進到該路徑下是看不到我複製的檔案, 這個問題由XE以來就一直困擾我!
pcplayer99
尊榮會員


發表:146
回覆:790
積分:632
註冊:2003-01-21

發送簡訊給我
#4 引用回覆 回覆 發表時間:2014-12-15 10:28:30 IP:120.236.xxx.xxx 訂閱
安卓底下,如果外部路径是 sdcard 应该是没有问题的。比如我在 sdcard 里面建立一个 Folder 然后在里面放一个 bmp file。然后用 XE7 写一个 APP 去读它,是能够读到的。

/mnt/sdcard/myFolder/a.bmp 这样的路径是可以在安卓底下读到的。
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#5 引用回覆 回覆 發表時間:2014-12-25 08:15:57 IP:114.32.xxx.xxx 訂閱
使用以下的路徑理論上是沒問題的。至於看不到這件事… 不用理它。重點是,你移除後,再次用這路徑來讀時,資料是否存在比較重要。

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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2014-12-28 01:46:35 IP:118.169.xxx.xxx 未訂閱
我目前正是使用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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2014-12-28 01:55:07 IP:220.129.xxx.xxx 訂閱
依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

發送簡訊給我
#8 引用回覆 回覆 發表時間:2014-12-28 01:57:53 IP:220.129.xxx.xxx 訂閱
補充: 「GetDocument 下, 可以讀取, 但看不到」  。是的,因它就是被android os 規定為 internal storage (內部)。它會在app不見時也不見,且,不是該app是無法被存取(root除外)。

------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#9 引用回覆 回覆 發表時間:2014-12-28 02:17:51 IP:118.169.xxx.xxx 未訂閱
感謝蕭大說明, 
我實作把 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

發送簡訊給我
#10 引用回覆 回覆 發表時間:2014-12-28 02:25:54 IP:220.129.xxx.xxx 訂閱
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

發送簡訊給我
#11 引用回覆 回覆 發表時間:2014-12-28 02:39:18 IP:220.129.xxx.xxx 訂閱
深入一點去看,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

發送簡訊給我
#12 引用回覆 回覆 發表時間:2014-12-28 19:15:20 IP:1.175.xxx.xxx 訂閱
如果說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

發送簡訊給我
#13 引用回覆 回覆 發表時間:2014-12-28 20:07:23 IP:220.129.xxx.xxx 訂閱
問題點是:
'/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

發送簡訊給我
#14 引用回覆 回覆 發表時間:2014-12-29 09:36:09 IP:61.226.xxx.xxx 訂閱
如果不想寫死, 也很容易, 先用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

發送簡訊給我
#15 引用回覆 回覆 發表時間:2014-12-29 09:50:10 IP:61.226.xxx.xxx 訂閱
現在用delphi 的程式員太少了, 我給後輩們加加油, 有你們努力研發, delphi 才可能發光發亮, 大家加油,相互提供程式碼, 進而減少摸索的時間,提高學習曲線
P.D.
版主


發表:603
回覆:4038
積分:3874
註冊:2006-10-31

發送簡訊給我
#16 引用回覆 回覆 發表時間:2014-12-31 12:15:41 IP:118.160.xxx.xxx 未訂閱
就怕彈援不足, 
所謂長江後浪推前浪,
前浪死在沙灘上,
但現在是沒有後浪, 前浪推不到沙灘上~~~
===================引 用 fred 文 章===================
現在用delphi 的程式員太少了, 我給後輩們加加油, 有你們努力研發, delphi 才可能發光發亮, 大家加油,相互提供程式碼, 進而減少摸索的時間,提高學習曲線
系統時間:2024-03-30 17:02:21
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!