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

有關資料庫記錄保存的問題

缺席
P.D.
版主


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2014-02-04 17:17:56 IP:61.223.xxx.xxx 未訂閱
請問各位, 

先前我按上課廖老師的案例, 在 DataModule 中設置好 FireDAC 的 TFDConnection 及一組 TFDTable,
在 DM 的 O n create 寫以下的 code

sFileName := TPath.GetTempPath PathDelim 'test.sdb';
FDC_LocalSet.Params.Values['Database'] := sFileName;
FDC_LocalSet.Params.Values['User_Name'] := 'xxxx';
FDC_LocalSet.Params.Values['Password'] := 1234567;
if FileExists(sFileName) = False then begin
sql := 'CREATE TABLE IF NOT EXISTS [LOCALSET] ('
'[DEFSIZES] TEXT, '
'[DEFRATIO] TEXT, '
'[DEFPIXEL] TEXT, '
'[IPFROM] TEXT, '
'[DATAFROM] TEXT, '
'[MD5] TEXT, '
'[PROVIDER] TEXT) ' ;
FDC_LocalSet.Connected := True;
FDC_LocalSet.ExecSQL(sql);
FDC_LocalSet.Connected := False;
end;
FDC_LocalSet.Connected := True;
FDT_LocalSet.Open();
FDT_LocalSet.First;
if FDT_LocalSet.IsEmpty then begin
FDT_LocalSet.Append;
FDT_LocalSet.FieldByName('DEFSIZES').Value := '320';
FDT_LocalSet.FieldByName('DEFRATIO').Value := '4';
FDT_LocalSet.FieldByName('DEFPIXEL').Value := '80';
FDT_LocalSet.FieldByName('IPFROM').Value := '127.0.0.1';
FDT_LocalSet.Post;
end;
FDC_LocalSet.Connected := False;
except
on E:Exception do begin
ShowMessage(pChar(E.Message));
end;
end;

程式細節與廖老師有些差異, 不過大致差不多, 使用 SQlite
因為不知為什麼無法存入到 TGetDocumentPath 的路徑, 只好放在 TGetTempPath,
按廖老師的解法, 由系統自動產生SQlite 的資料庫, 就可以不用管分發 sdb 的問題,
這段程式的執行是沒有問題的, 如果 test.sdb 不存在, 則建立一個檔案, 如果 LocalSet Table 不存在,
則產生一個 Table , 再者如果記錄為空, 則自動填入一筆記錄

在首次丟到手機測試, 一切正常, 各欄位也就按既定的程式走,
但如果我重新編譯再次丟到手機(丟手機前, 我有在手機上改變各欄的資料值)
當程式第二次啟動, 我發現 test.sdb 的內容全部又回到預設值
(這裡指的是丟第二次的結果, 如果是第一次丟進來, 關閉手機程式再次啟動, 資料是會被保留的)

我不知道問題出在那裡?
這段程式如果放在 WINDOWS 上執行是不會有這樣的情況
aftcast
站務副站長


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

發送簡訊給我
#2 引用回覆 回覆 發表時間:2014-02-05 17:48:54 IP:66.249.xxx.xxx 訂閱
 因為下面那句話,所以第二次再執行同這句時,不會再create!
sql := 'CREATE TABLE IF NOT EXISTS [LOCALSET] ('
注意 if not exists這三個單子!
我吃飯拿手機看到此文,沒仔細看,若有錯,別打我:p
------


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

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


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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2014-02-05 22:26:50 IP:118.160.xxx.xxx 未訂閱
蕭大俠, 好久不見了

你沒錯, 所以不會打你啦!

不過你可能誤會我發的意思,
我這篇所指的是
如果是第一次丟到手機, 會進行安裝, 此時手機內沒有 TEST.SDB檔, 所以會create 一佪 test.sdb,
理所當然這個 sdb 必然是空檔, 所以 if not exists localset 會成立, 所以自動執行這段 sql , 創建一個Localset 的 table
所以我在手機上執行n次, 都不會再觸發 if not exists 了

但問題是, 我實測的結果,
如果之前我已對 localset 進行記錄的異動也被保存下來了, 當我進行程式開發時, 二度丟到手機, 手機會進行重安裝,
當我回頭再去啟動app(二次安裝後), 我發現, 資料庫的內容都被還原了, 也就是說, 我先前所異動的記錄全部不見,
原本我以為重安裝會解除資料庫(因為我看手機的動作, 重安裝似乎是先解除再安裝), 可是我單獨測試解除, temp下的 test.sdb還是會被保留,
我也測試過, 把 sdb 拉回到電腦, 利用 xe5 的 firedac explorer 查看內容, 我先前異動的記錄都在,
但經過二度安裝, 就是會造成資料庫記錄全部消失, 這會讓程式無法操作下去,
所以我不清楚手機的運作模式, 也不知道問題發生在那, 是 xe5 的問題, 還是 android 的原則性問題?
那如果是系統的問題, 如果我app改版, 客戶要如何更新及保存先前的設定呢?


TS [LOCALSET] ('
注意 if not exists這三個單子!
我吃飯拿手機看到此文,沒仔細看,若有錯,別打我:p
Main Chen
高階會員


發表:29
回覆:135
積分:127
註冊:2002-10-07

發送簡訊給我
#4 引用回覆 回覆 發表時間:2014-02-06 08:23:53 IP:112.104.xxx.xxx 訂閱
將資料存放在 GetDocumentsPath 目錄有以下特性:

1. 使用 XE5 IDE 去 Deploy 到實機上, 會將原先存在的 apk 及 GetDocumentsPath 目錄內的所有資料全部刪除.

2. 但透過 Play 商店更新版本, 則不會刪除 GetDocumentsPath 目錄內的資料, 因此這也延伸出一個問題, 就是放在此目錄下的檔案, 有必要更新時, 必需要自行寫程式去更新.

以上是實測的結果.

===================引 用 P.D. 文 章===================
所以我不清楚手機的運作模式, 也不知道問題發生在那, 是 xe5 的問題, 還是 android 的原則性問題?
那如果是系統的問題, 如果我app改版, 客戶要如何更新及保存先前的設定呢?
P.D.
版主


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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2014-02-06 09:30:17 IP:118.160.xxx.xxx 未訂閱
1. 我放的是在 GetTempPath, 而不是在 GetDocumentspath, 我實測在 TempPath下, 自行創建的檔案不會被刪除
2. 前一篇我曾有發過, 不知道為什麼, 發佈在 GetDocumentspath 下的檔案, 進入手機尋找, 都看不到任何放在deploy 發佈到這個位置的檔案
所以我根本無法把檔案發佈到 Documents
===================引 用 Main Chen 文 章===================
將資料存放在 GetDocumentsPath 目錄有以下特性:

1. 使用 XE5 IDE 去 Deploy 到實機上, 會將原先存在的 apk 及 GetDocumentsPath 目錄內的所有資料全部刪除.

2. 但透過 Play 商店更新版本, 則不會刪除 GetDocumentsPath 目錄內的資料, 因此這也延伸出一個問題, 就是放在此目錄下的檔案, 有必要更新時, 必需要自行寫程式去更新.

以上是實測的結果.

===================引 用 P.D. 文 章===================
所以我不清楚手機的運作模式, 也不知道問題發生在那, 是 xe5 的問題, 還是 android 的原則性問題?
那如果是系統的問題, 如果我app改版, 客戶要如何更新及保存先前的設定呢?
Main Chen
高階會員


發表:29
回覆:135
積分:127
註冊:2002-10-07

發送簡訊給我
#6 引用回覆 回覆 發表時間:2014-02-06 09:57:21 IP:112.104.xxx.xxx 訂閱
1. 不建議把檔案存在 GetTempPath, 因為一些清理工具會把它給清除.
2. 如果有 Root 可以用檔案瀏覽工具查看 GetDocumentspath 檔案, 放在 /data/data/com.xxxxx.xxxxx/files

===================引 用 P.D. 文 章===================
1. 我放的是在 GetTempPath, 而不是在 GetDocumentspath, 我實測在 TempPath下, 自行創建的檔案不會被刪除
2. 前一篇我曾有發過, 不知道為什麼, 發佈在 GetDocumentspath 下的檔案, 進入手機尋找, 都看不到任何放在deploy 發佈到這個位置的檔案
所以我根本無法把檔案發佈到 Documents
P.D.
版主


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

發送簡訊給我
#7 引用回覆 回覆 發表時間:2014-02-06 11:46:05 IP:59.120.xxx.xxx 未訂閱
這個部份我有確認過, 我的手機是 HTC EVO (2年前手機, 版本4.0.3)
在/android/data/com.embarcadero.xxx/files 不是 /data/data/...
我也想放在 Documents 下, 只是放不進去啊!

===================引 用 Main Chen 文 章===================
1. 不建議把檔案存在 GetTempPath, 因為一些清理工具會把它給清除.
2. 如果有 Root 可以用檔案瀏覽工具查看 GetDocumentspath 檔案, 放在 /data/data/com.xxxxx.xxxxx/files

===================引 用 P.D. 文 章===================
1. 我放的是在 GetTempPath, 而不是在 GetDocumentspath, 我實測在 TempPath下, 自行創建的檔案不會被刪除
2. 前一篇我曾有發過, 不知道為什麼, 發佈在 GetDocumentspath 下的檔案, 進入手機尋找, 都看不到任何放在deploy 發佈到這個位置的檔案
所以我根本無法把檔案發佈到 Documents
系統時間:2024-04-20 21:54:24
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!