有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java更好的SQLite损坏检测

首先,一些背景:

我的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] += 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'

结果表明,以这种方式“编辑”表格数据是完全可能的:

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

在完整性检查未检测到的修改中,有一半的修改在运行查询时失败了,这通常是很有趣的,但对我来说,最有趣的是,某些东西可能会在我的数据库中交换随机字节,从而使我的应用程序对一部分用户毫无用处

我在SQLite网站和StackOverflow上读到了可能导致损坏的原因,我知道,例如强制关闭应用程序可能会对数据库造成损害。我只是想知道是否有可能实现一个快速、更健壮的数据库完整性检查

我在启动时从整个表的一列中读取数据(例如自动完成),所以我想从all值中计算一些散列-我认为这会很好,因为一些散列函数只是为了进行完整性检查而设计的,但也许有一个更简单、更快、更好的解决方案-因此我问你,如果你知道的话


共 (1) 个答案

  1. # 1 楼答案

    我不知道有任何类似这样的SQLite特性,所以我认为计算散列是最简单的解决方案,首先看一下^{}