2016-04-07 63 views
0

我的問題很難解釋。在我的應用程序中,有一個我製作的自定義對象。在這個對象中,是日期時間戳。此外,在這個對象中有幾張照片(或照片的參考?),用戶可以使用相機硬件進行拍攝。所以我需要能夠存儲幾張圖片以及這個共享的時間戳。如何處理Android/SQlite層次結構中的圖像關聯?

我的問題是如何將這些信息存儲在SQLite數據庫中,因爲我希望這些信息能夠持久存在。我不認爲在數據庫中存儲實際的圖像是一個好主意,但我不知道你會存儲什麼類型的參考。你只是將路徑存儲到數據庫中的文件系統上?你實際存儲什麼?如果有人決定將他們的數據保存到SD卡而不是內部存儲等,該怎麼辦?這類事情處理的典型方式是什麼?Android/SQlite內置了哪些處理這種情況的東西?

+0

你說'也在這個對象中有幾張照片(或對照片的引用?)'。照片如何完全存儲在對象中?一個URL?,一個文件路徑?一個字節數組?也許最好將一些代碼添加到你的問題中。 – Ridcully

+0

@Ridcully我還沒有任何代碼照片的東西,因爲我仍然在這一點上的計劃階段。我只是試圖弄清楚我可以/應該在典型/最佳實踐方面實施什麼。 – KaliMa

+0

例如,在每個對象中都有一組Bitmap是明智的,但也許大多數人會避免這種情況,因爲它使用了大量的內存/資源,所以他們可能會存儲一些其他文件句柄,而只在需要時調用圖片,以及等等。我不確定這種情況通常如何處理。 – KaliMa

回答

1

你應該保存圖像的路徑到你的sqlite數據庫。如果您希望圖像位於內部存儲器或外部存儲器中,則由您決定。取決於你的需求。內部存儲將始終可用,並且只對您的應用程序專用,因此用戶將無法刪除照片,並且可以消除不需要的例外。 Visit this link to get an idea on storage options.

您還希望將這些路徑與唯一鍵(即時間戳)保存起來,以便稍後根據所存儲的時間戳查詢這些圖像。時間戳始終是唯一的,因此您應該將其作爲主鍵。

您可以使用任何庫或您自己的實現來將這些圖像延遲加載到您的UI線程。 This SO thread has good ideas if you're thinking of rolling your own lazy loading.

+0

你是什麼意思,延遲加載圖像到UI線程? – KaliMa

+0

如果要在回收視圖或列表視圖中顯示圖像,如果圖像太多,則會阻塞UI線程(應用程序UI操作運行的主線程)。您不允許執行長時間運行操作,如加載位圖並將位圖直接調整到主線程上。 –

+0

像有一個列表縮略圖在裏面?如果列表太長/如果圖片太多,即使使用RecyclerView,也會出現問題? – KaliMa

1

將圖像保存到手機內存或SD卡上,並只保存到您的sqlite數據庫的路徑。這將比存儲圖像好得多

+0

我使用與我的應用程序關聯的sqlite數據庫。我在問我在數據庫中存儲的內容,因爲這些對象會被解析/記錄到表中。 – KaliMa

+0

只是在你的數據庫中存儲你的圖像的路徑 –

+0

@KaliMa不太確定爲什麼downvote ...通過路徑,它將是一個'String'引用,可以在檢索時被解析爲'Uri'。如果你要在SQLite數據庫中存儲圖像,它應該是一個「BLOB」列示例:http://stackoverflow.com/a/9309315/4252352 - 但是,如果你說它可能是不少圖像會使性能變慢,數據庫將迅速增長。您可以使用像Picasso或Glide這樣的庫來處理顯示位圖,因爲它們提供了緩存選項和異步加載。 –

1

對於我的應用程序(Memorix筆記&覈對清單,如果您必須知道),我將圖像本身保存到文件系統的應用程序專用部分並將文件路徑保存在數據庫中作爲一個字符串。

將圖像保存在公用文件系統中可能會使用戶刪除或重命名文件時數據庫不一致。

如果您期望很多圖像,請注意,每個目錄允許有多少個文件存在限制。在我的應用程序中,我確保文件夾中沒有超過1000張圖像,然後啓動一個新文件夾。

至於您提到的關聯 - 如果您只需要時間戳,請將「時間戳」字段添加到圖像表中。如果您需要「主」對象與關聯圖像之間的實際1:n關係,請創建一個「主」表和一個「圖像」表,並在映射表中引用主表中的外鍵字段。

+0

很好的答案,有一些有用的附加信息需要考慮。 –

+0

當你說「app-private」時,你的意思是/ data/data/packagename /文件夾嗎?示例文件路徑字符串在數據庫中的樣子是什麼? – KaliMa

+0

使用getFilesDir()(http://developer.android.com/reference/android/content/Context.html#getFilesDir())獲取應用程序專用文件系統的基礎文件夾。 – Ridcully