首先,一些背景:
我的Android应用程序有DB表,有很多四列行.它向服务器发送请求,服务器仅在所有这四个值都"有效"时才响应.数千名用户中的一些人报告说某些东西对他们不起作用(因为他们一段时间没有从服务器获得结果) - 我试图找出导致问题的原因,结果证明唯一可能的原因是未检测到的数据库损坏.
在ACRA日志中,我收到了一些带有SQL错误的消息,但这些消息是由于应用程序因为损坏而无法打开文件.这给了我一些线索,但我仍然不相信这是问题所在.所以,我创建了一个非常简单的Python脚本,它改变了DB文件中的随机字节,并检查SQLite将如何处理:
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] …Run Code Online (Sandbox Code Playgroud)