Prática recomendada para manter os dados na memória e no banco de dados ao mesmo tempo no Android

Estamos projetando um aplicativo Android com muitos dados ("clientes", "produtos", "pedidos" ...) e não queremos consultar o SQLite toda vez que precisarmos de algum registro. Queremos evitar consultar o banco de dados o máximo possível, por isso decidimos manter determinados dados sempre na memória.

Nossa idéia inicial é criar duas classes simples:

"MemoryRecord": uma classe que conterá basicamente uma matriz de objetos (string, int, double, datetime, etc ...), que são os dados de um registro de tabela e todos os métodos para obter esses dados. array.

"MemoryTable": uma classe que conterá basicamente um mapa de [Key, MemoryRecord] e todos os métodos para manipular esse mapa e inserir / atualizar / excluir registros no / do banco de dados.

Essas classes serão derivadas para todo tipo de tabela que temos no banco de dados. É claro que existem outros métodos úteis não listados acima, mas eles não são importantes neste momento.

Portanto, ao iniciar o aplicativo, carregaremos essas tabelas de um banco de dados SQLite na memória usando essas classes, e toda vez que precisarmos alterar alguns dados, trocaremos de memória e os publicaremos no banco de dados logo após.

Mas, queremos alguma ajuda / conselho de você. Você pode sugerir algo mais simples ou eficiente para implementar uma coisa dessas? Ou talvez algumas classes existentes que já fazem isso por nós?

Entendo o que vocês estão tentando me mostrar e agradeço por isso.

Mas, digamos que temos uma tabela com 2000 registros, e precisarei listar esses registros. Para cada uma, tenho que consultar outras 30 tabelas (algumas delas com 1000 registros, outras com 10 registros) para adicionar informações adicionais à lista, e enquanto estiver "voando" (e como você sabe, devemos ser muito rápidos neste momento).

Agora você dirá: "apenas construa sua consulta principal com todas essas 'junções' e traga tudo o que você precisa em uma única etapa. O SQLite pode ser muito rápido, se seu banco de dados estiver bem projetado, etc ...".

OK, mas essa consulta se tornará muito complicada e segura, embora o SQLite seja muito rápido, será "muito" lento (2 a 4 segundos, como confirmei, e esse não é um tempo aceitável para nós).

Outro complicador é que, dependendo da interação do usuário, precisamos "consultar novamente" todos os registros, porque as tabelas envolvidas não são as mesmas e precisamos "entrar novamente" com outro conjunto de tabelas.

Portanto, uma alternativa é trazer apenas os registros principais (isso nunca muda, não importa o que o usuário faça ou queira) sem associação (isso é muito rápido!) E consulte as outras tabelas sempre que quisermos alguns dados. Observe que na tabela com apenas 10 registros, buscaremos os mesmos registros muitas e muitas vezes. Nesse caso, é uma perda de tempo, porque não importa o rápido SQLite, sempre será mais caro consultar, cursar, buscar, etc ... do que apenas pegar o registro de um tipo de "cache de memória". Quero deixar claro que não planejamos manter todos os dados sempre na memória, apenas algumas tabelas que consultamos com muita frequência.

E chegamos à pergunta original: qual é a melhor maneira de "armazenar em cache" esses registros? Eu realmente gosto de focar a discussão nisso e não em "por que você precisa armazenar dados em cache?"