Zapisanie obrazu w bazie danych SQLite w aplikacji mobilnej

0

Witam. Proszę o pomoc w przerobieniu aplikacji tak by przechowywała obrazy w sqlite zamiast w drawable. Obrazy są skorelowane z tytułem i opisem. Obecnie te dane są w postaci poniżej. Są tutaj 2 nazwy zamków, 2 ich opisy i 2 ścieżki do zdjęć.

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <array name="pictures">
        <item> @drawable/castell_caerdydd</item>
        <item> @drawable/fuerstenstein</item>
    </array>

    <string-array name="names">
        <item> "Castell Caerdydd"</item>
        <item> "Schloss Fürstenstein" </item>
    </string-array>
    <string-array name="descriptions">
        <item>"Castell Caerdydd (pol.Zamek w Cardiff, eng.Cardiff Castle) to okazały normandzki zamek i XIX-wieczna rezydencja utrzymana w stylu wiktoriańskiego neogotyku."</item>
        <item>"Schloss Füerstenstein (pol. Książ) - zespół rezydencjalny znajdujący się w Wałbrzychu przy ulicy Piastów Śląskich 1 w dzielnicy Książ."</item>
    </string-array>

</resources>

W głównej klasie aplikacji pobieram te dane do tablic o deklaracji:

    public static String[] NAME; //Nazwy zamków.
    public static String[] DESCRIPTION; //Opisy zamków.
    public static TypedArray IMAGE; //Obrazy zamków.

Pobieranie danych z XML do tych tablic:

        Resources resources = getResources();
        NAME = resources.getStringArray(R.array.names);
        DESCRIPTION = resources.getStringArray(R.array.descriptions);
        IMAGE = resources.obtainTypedArray(R.array.pictures);

Name i Description wkładam do bazy do pól typu TEXT bo pochodzą z tablicy Stringów. A do jakiego typu pola mogę włożyć dane pochodzące z TypedArray?

0

Nie da się czegoś takiego zrobić. W TypedArray może się chować kilka innych wartości z różnymi typami i nie ma łatwego sposobu konwertowania ich do i z bajtów. Powinieneś zapisywać gdzieś lokalnie na urządzeniu obrazki i w bazie danych trzymać tylko ścieżkę do nich.

Poza tym po co chcesz to robić, skoro dostęp do obrazków za pomocą R.drawable.* jest już ogarnięty przez system?

0

Szczerze to nie wiem po co, jest to jedno z wymagać na zaliczenie. Z tego zrozumiałem to obrazki powinny być konwertowane na ciąg bitów który będzie zapisany w bazie. Nie mam doświadczenia z mobilkami, a analogiczną funkcjonalność w webdevie robiłem poprzez zapisywanie linków bazie, albo poprzez generowanie odpowiedniej nazwy dla zapisywanego obrazu.
Więc pytanie jak obraz zamienić na odpowiedni ciąg bitów gotowy do wrzucenia do bazy, i jak potem go z powrotem zamienić na obraz? Może są jakieś wbudowane funkcje do tego?

1

No cóż, nie ma to najmniejszego sensu. Nawet nie wiem, czego miałoby nauczyć. Ale możesz to zrobić w ten sposób. Czyste bajty w SQLite możesz zapisać jako BLOB albo przekonwertować byte[] na String w np. Base64 i zapisać jako TEXT.

void saveImagesToDatabase(@ArrayRes int arrayId, Resources res) {
  List<Integer> drawableIds = extractItemIds(arrayId, res);
  for (int drawableId : drawableIds) {
    Bitmap bitmap = BitmapFactory.decodeResource(res, drawableId);
    byte[] bytes = marshallBitmap(bitmap);
    saveToDatabase(bytes);
  }
}

List<Integer> extractItemIds(@ArrayRes int arrayId, Resources res) {
  TypedArray array = res.obtainTypedArray(arrayId);
  List<Integer> itemIds = new ArrayList<>(array.length());
  for (int i = 0; i < array.length(); i++) {
    itemIds.add(array.getResourceId(i, -1));
  }
  array.recycle();
  return itemIds;
}

byte[] marshallBitmap(Bitmap bitmap) {
  ByteArrayOutputStream stream = new ByteArrayOutputStream();
  bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream);
  return stream.toByteArray();
}

void saveToDatabase(byte[] bytes) {
  // TODO
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1