我打算在SQLite
db表格中轉換一個text
文件;我很關心這些問題,因爲不惜一切代價爲它編寫代碼:SQLite vs文本文件數據庫 - 大小比較?
- 這兩個文本文件或其對應的sqlite數據庫都是相同的大小?
- SQLite會佔用比文本文件更少的空間嗎?
- 或者文本文件db是空間最小的那個?
我打算在SQLite
db表格中轉換一個text
文件;我很關心這些問題,因爲不惜一切代價爲它編寫代碼:SQLite vs文本文件數據庫 - 大小比較?
我期望文本文件變得更小,因爲它沒有任何開銷:數據庫給你的所有東西都有空間成本。
聽起來好像空間是唯一對你很重要的東西,並且你希望經常改變文本文件的內容(你稱之爲'文本文件db')。請注意,沒有「文本文件數據庫」這樣的東西。與適當的數據庫(如SQLite)相比,讀取和寫入數據將非常緩慢。添加不同的記錄類型(數據庫中的表格)會使您的想法複雜化,我不想嘗試維護文本文件中記錄類型之間的任何類型的引用鏈接。
希望幫助 -
"Hardware is cheap" - 我強烈建議不要擔心大小的差異,這將可能是微不足道的,無論如何,而是選擇哪種解決方案最適合你的需要休息。對於簡單的項目,文本文件可以很好地工作,但是數據庫有更多的功能可以幫助您更高效,更有效地組織,備份和查詢數據。
爲了更深入地看看正反兩種方案的利弊,請上網:database vs. flat files
是的,謝謝。我實際上需要獲取DB版本的文本文件,只是爲了優化和高效查詢。 – Master
有些事情要記住:
(注意這個答案:文件在這裏內部參考/外部存儲,不SharedPrefs)
SQL:
文件:
操作系統使用空間爲每個文件,但不包括的內容。實例的文件名稱,佔用空間。但要記住的是,您可以將應用程序的所有數據保存在單個文件中。如果您有一個應用程序,兩種不同類型的對象可能有命名問題,您可以創建一個新的數據庫。
命名衝突
假設你有兩個對象,對象X和Y.
方案1'
對象X存儲兩個變量。文件名是(x和y在這種情況下是座標):
x.txt
y.txt
但是在更高版本中,對象Y帶有相同的兩個文件。 所以,你必須指定一個ID爲對象的X和Y:
0-x.txt
0-y.txt
每個文件的名稱使用3個字符(7共有包括擴展名)獨自一人。這個設置越複雜越大。參見場景2
但是,在數據庫中保存時,會得到ID爲0的行並找到列X或Y. 您不必擔心文件名。
此外,如果每個對象保存大量文件,則加載或保存每個文件的引用將佔用大量空間。這會影響您的APK文件,並緩慢推動您達到50 MB限制(谷歌播放限制)。
您可以創建通用方法,但是您可以對SQL執行相同的操作並在APK文件中節省空間。但與文本文件相比,SQL確實可以節省一些名稱空間。
不過請注意,如果您保存2-3文件(只取數字)將名字那幾個字節不會不要緊
這是當你開始儲蓄數以百計的文件,長名以避免命名衝突,即SQL在節省空間的時候。如果表格變得太大,可以壓縮它。您可以壓縮文本文件以節省一些空間,但是對於單行文件,節省的內容並不多。
方案2
對象X和Y各有三個孩子。
每個孩子有3個變量保存到文件系統。如果有3個孩子,只有一個對象,它可以挽救像這樣
[id][variable name].txt
但因爲有3個孩子另一位家長(同一類型,而且它們保存在同一文件)對象的孩子誰最後保存的是保存的那些。前3個被覆蓋。
所以,你必須添加父ID:
[parent ID][child ID][variable name].txt
而且記住,這些例子都集中在幾個對象。節省的空間量很低,但是當您節省數百個,即使不是數千個文件時,也就是當您開始節省空間時。
現在,如果你創建一個表,你可以存儲你的主要對象(在這種情況下是X和Y)。然後,您可以創建第一個表格,使其能夠識別該對象是父級還是子級,還是可以創建第二個表格。第二個表有兩個ID值;一個標識父母,一個標識孩子。所以,如果你想找到對象436的所有孩子,你只要寫這個查詢:
SELECT * FROM childrentable WHERE `parent_id`='436'
這會給你所有對象436作爲其父的孩子的所有屬性。
返回時,所有內容都存儲在光標中。
如果你做同樣的一個文件,這條線(其中Saver
是文件保存和加載類):
Saver.load("0-436-file_name", context);
當然的,可以使用一個for循環來請循環播放兒童ID(開始時爲0),但您還必須保存其中有多少兒童:您無法輕鬆獲取文件,因此您必須存儲關於對象數量和對象兒童的值。
這意思是你必須在更多的文件中保存更多的值,以便能夠首先獲取你保存的文件。這是一個很難做到的事情。數據庫可以幫助您不必編寫文件來跟蹤您保存的文件數量。數據庫將在每個查詢中返回[x]個結果。因此,如果對象436沒有子項,則SQL返回0行。但是在文件中,你必須保存0作爲孩子的數量。猜測文件名會導致I/O異常。
如果你選擇去使用SQLite那麼線程[「調整爲最佳的壓縮SQLite數據庫」(http://comments.gmane.org/gmane.comp.db.sqlite.general/72648)可感興趣。 – iljau
是的,有點幫助。謝謝。 – Master