Я прохожу с greenDAO, и пока все будет хорошо. Одна вещь, которая, как представляется, не покрывается документами или веб-сайтом (или где угодно:(), - это то, как он справляется с безопасностью потоков.
Я знаю основы, упомянутые в других местах, например, "использовать один сеанс dao" (общая практика для Android + SQLite), и я хорошо понимаю модель памяти Java. Внутренние библиотеки даже кажутся потокобезопасными или, по крайней мере, построены с этим намерением. Но я ничего подобного не видел:
greenDAO кэширует объекты по умолчанию. Это отлично подходит для полностью однопоточной программы - прозрачной и массивной производительности для большинства целей. Но если я, например. loadAll()
, а затем изменить один из элементов, я изменяю один и тот же объект по всему миру в своем приложении. Если я использую его в основном потоке (например, для отображения) и обновляя БД на фоновом потоке (как правильно и правильно), существуют очевидные проблемы с потоками, если не будет предпринята особая осторожность.
Обеспечивает ли greenDAO что-либо "под капотом" для защиты от обычных проблем с резьбой на уровне приложений? Например, изменение кэшированного объекта в потоке пользовательского интерфейса при сохранении его в фоновом потоке (лучше надеяться, что они не чередуются, особенно при изменении списка!)? Существуют ли какие-либо "лучшие практики" для защиты от них, помимо общих проблем безопасности потоков (т.е. Чего ожидает GreenDAO и хорошо работает)? Или весь кеш смертельно испорчен с точки зрения безопасности многопоточности?