elhor detecção de corrupção do SQLite

Inicialmente, alguns antecedentes:

Minhas Android aplicativo @ possui uma tabela de banco de dados com muitas linhas de quatro colunas. Ele envia solicitações ao servidor e o servidor responde apenas quando todos esses quatro valores são "válidos". Alguns dos milhares de usuários relataram que algo não funciona para eles (já que por algum tempo eles não estão obtendo os resultados do servidor) - eu estava tentando descobrir o que estava causando o problema e a única causa possível é a Corrupção de banco de dados que não está sendo detectada.

Nos logs da ACRA, recebi algumas mensagens com erros de SQL, mas estas eram sobre o aplicativo não conseguir abrir o arquivo por estar corrompido. Isso me deu uma pista, mas eu ainda não estava convencido de que esse é o problema. Então, criei um script Python muito simples que altera bytes aleatórios no arquivo DB e verifica como o SQLite lidará com isso:

import random
import array
import sqlite3

db = array.array('B')
db.fromstring(open('db').read())

ta =  [x for x in sqlite3.connect('db').execute('SELECT * FROM table ORDER BY _id')]

results = [0,0,0,0]
tries = 1000

for i in xrange(0,tries):
    work = db[:]
    while work == db: 
        for j in xrange(0,random.randint(1,5)):
            work[random.randint(1,len(db))-1] = random.randint(0,255)

    work.tofile(open('outdb','w'))

    try:
        c = sqlite3.connect('outdb')
        results[0] += 1

        for r in c.execute('PRAGMA integrity_check;'):
        results[1] += 1 if (r[0] == 'ok') else 0 
    except:
        continue    

    try:
        results[3] += 1 if [x for x in c.execute('SELECT * FROM table ORDER BY _id')] != ta else 0
        results[2] += 1
    except:
        c.close()
        continue

print 'Results for '+str(tries)+' tests:'
print 'Creating connection failed '+str(tries-results[0])+ ' times'
print 'Integrity check failed '+str(results[0]-results[1])+ ' times'
print 'Running a SELECT * query failed '+str(results[1]-results[2])+ ' times'
print 'Data was succesfully altered '+str(results[3])+ ' times'

Os resultados mostraram que "editar" os dados da tabela desta maneira é inteiramente possível:

Results for 1000 tests:
Creating connection failed 0 times
Integrity check failed 503 times
Running a SELECT * query failed 289 times
Data was succesfully altered 193 times

Geralmente é interessante ver que a execução de uma consulta falhou por metade das modificações que não foram detectadas pela verificação de integridade, mas o mais interessante para mim é que algo pode trocar bytes aleatórios no meu banco de dados, tornando o aplicativo inútil para uma parte dos meus usuários .

Eu li sobre as possíveis causas de corrupção no site SQLite e também no StackOverflow. forçar o fechamento do aplicativo pode causar danos ao banco de dados. Gostaria apenas de saber se é possível implementar uma verificação de integridade do banco de dados rápida e mais robust

Estou lendo os dados de uma coluna de toda a tabela na inicialização (para preenchimento automático), então pensei em calcular algum hash a partir de todos os valores - acho que isso funcionaria muito bem, já que algumas funções de hash foram projetadas apenas para fazendo verificações de integridade, mas talvez exista uma solução mais simples, rápida e melhor - estou perguntando, se você conhece algum

questionAnswers(2)

yourAnswerToTheQuestion