2012-04-29 6 views
9

Pracuję nad projektem, który wymaga przechowywania bitmap na stole. Te bitmapy są używane w adapterach danych do wyświetlania na listach. Ta tabela może zawierać więcej niż 1000 obrazów. Powodem, dla którego obecnie nie przechowuję plików, jest to, jak szybko mogę czytać i zapisywać obrazy w db.W jaki sposób kursor SQLite działa wewnętrznie?

Czego właściwie szukam, to zrozumieć ograniczenia kursora SQLite. Jak kursor jest załadowany do pamięci? Czy umieszcza wyniki zapytania w pamięci, czy tworzy jakiś typ pliku do odczytu/zapisu? Nie chcę napotkać problemów, w których zapytanie o duże zbiory danych powoduje, że w urządzeniu skończy się pamięć.

+0

Istnieje [CursorWindow] (http://developer.android.com/reference/android/database/CursorWindow.html) i wygląda na to, że służy do ładowania tylko części zapytania za każdym razem, gdy "moveToXyz". Dane powinny pochodzić bezpośrednio z bazy danych. – zapl

+0

"Pracuję nad projektem, który wymaga przechowywania bitmap na stole." - ick. "Ta tabela może zawierać więcej niż 1000 obrazów." - więcej ick. "Powodem, dla którego obecnie nie przechowuję plików, jest to, jak szybko mogę czytać i zapisywać obrazy w db." - z definicji plik będzie tak szybki lub szybki, ponieważ SQLite musi przechowywać swoje rzeczy w pliku. – CommonsWare

+0

zapl dzięki za te informacje. @CommonsWare Not sure what ick oznacza: P Myślę, że wydaje się, że powinien być szybki lub szybszy odczyt z pliku niż db. Nie wiem zbyt wiele na temat kursorów, poza tym, jak ich używać ... ale czy SQLite nie optymalizuje sposobu czytania z danych? Chodzi mi o to, że czytanie danych obrazu z pliku wiele razy wydaje się dużo wolniejsze niż czytanie z kursora. – Jona

Odpowiedz

0

To jest stary post, który zrobiłem. Moim rozwiązaniem było zapisanie obrazów do pliku i zapisanie ścieżki do obrazu w tabeli bazy danych. To było czystsze i wydawało się znacznie szybsze.

Pomysł zapisywania dużych danych binarnych w tabeli nie wydaje się prawidłowy. Nie mam szczegółowych informacji, dlaczego nie jest to dobry pomysł, ale tak właśnie czuję się po badaniach.

1

Jeśli sobie przypomnę, zachowa on jednak wiele wyników w pamięci podręcznej. Powinien on zazwyczaj znajdować się poniżej soft heap limit. Jest to limit doradczy, więc woli przekroczyć limit niż zwracać SQL_NOMEM.

Nie wierzę, że zapisuje na dysk dla jakichkolwiek mechanizmów buforowania. Dopóki każdy obraz mieści się w pamięci i nie znajduje się w indeksach, nie powinien stanowić problemu.

Nie jestem programistą dla Androida, bo to jest warte. Niektóre z tych rzeczy można było dostosować.

Jako tło, sqlite_step jest kursorem w domyślnej bibliotece. Nie wiem, czy Android wdrożył własne mechanizmy. Możesz znaleźć ogólne informacje na ich stronie o dynamic memory allocation.