gpt4 book ai didi

java - 更好的 SQLite 损坏检测

转载 作者:IT王子 更新时间:2023-10-29 06:26:47 24 4
gpt4 key购买 nike

首先,一些背景:

我的 Android 应用程序有一个包含很多四列行的数据库表。它向服务器发送请求,只有当所有这四个值都“有效”时,服务器才会响应。数以千计的用户中有少数人报告说有些东西对他们不起作用(因为有一段时间他们没有从服务器获得结果) - 我试图找出导致问题的原因,结果证明唯一可能的原因是未检测到的数据库损坏。

在 ACRA 日志中,我收到了一些带有 SQL 错误的消息,但这些消息是关于应用程序由于文件损坏而无法打开的。这给了我一些线索,但我仍然不相信这就是问题所在。因此,我创建了一个非常简单的 Python 脚本,它更改数据库文件中的随机字节并检查 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 上阅读了可能的损坏原因,我知道例如强制关闭应用程序可能会对数据库造成伤害。我只是想知道是否可以实现快速且更强大的数据库完整性检查。

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

最佳答案

我不知道任何像这样的 SQLite 功能,所以我会说计算哈希是最简单的解决方案,看看 MessageDigest开始上课。

关于java - 更好的 SQLite 损坏检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8973527/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com