- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在努力完善一个有效的 SQLite 数据库恢复。更具体地说,当数据库损坏时(我一直在使用其中包含 SQL 的文件并将其复制到数据库文件而不是数据库的副本)。
通过使用 SQL 查看 sqlite_master,我可以在没有处理程序的情况下处理这个问题(没有表检测到损坏)。
当我在研究技术时遇到 DatabaseErrorHanlder,我想我会涉足 DatabaseErorHandler。
我已经到了触发 DataBaseErrorHandler 的阶段(处理程序中的日志被调用(由于第二次尝试读取而调用了两次))。但是,与使用 null 而不是处理程序相比,我收到的错误报告更多,并且应用程序崩溃(好像让处理程序关闭了 SQLite 的自动化,我相信,删除了损坏的文件,因此对处理程序的任何调用都会重新创建它) .崩溃不是问题,因为很明显 SQLite 试图绕过损坏,但似乎处理程序阻止了它做它本来会做的事情。)
在没有处理程序的情况下运行会导致以下消息(第一个由应用程序编写为路标):-
11-03 16:36:13.414 10959-10959/? I/mjt.shopper: Thu Nov 03 16:36:13 AEDT 2016 Activity=dataBaseIntegrityCheck Method=MainDataHandling MSG=restore Database Integrity Check - IC Database created
11-03 16:36:13.415 10959-10959/? E/SQLiteLog: (26) file is encrypted or is not a database
11-03 16:36:13.416 10959-10959/? E/DefaultDatabaseErrorHandler: Corruption reported by sqlite on database: /data/data/mjt.shopper/databases/ICShopper
11-03 16:36:13.416 10959-10959/? E/DefaultDatabaseErrorHandler: deleting the database file: /data/data/mjt.shopper/databases/ICShopper
与我得到的处理程序一起运行(相同的路标 + 处理程序发出的路标):-
11-03 16:58:23.923 12265-12265/? I/mjt.shopper: Thu Nov 03 16:58:23 AEDT 2016 Activity=dataBaseIntegrityCheck Method=MainDataHandling MSG=restore Database Integrity Check - IC Database created
11-03 16:58:23.925 12265-12265/? E/SQLiteLog: (26) file is encrypted or is not a database
11-03 16:58:23.925 12265-12265/? I/mjt.shopper: Thu Nov 03 16:58:23 AEDT 2016 Activity=MainDataHandling Method=dataBaseIntegrityCheck MSG=DB onCorruption error handler invoked
11-03 16:58:23.925 12265-12265/? E/SQLiteLog: (26) file is encrypted or is not a database
11-03 16:58:23.927 12265-12265/? E/SQLiteDatabase: Failed to open database '/data/data/mjt.shopper/databases/ICShopper'.
android.database.sqlite.SQLiteDatabaseCorruptException: file is encrypted or is not a database (code 26): , while compiling: PRAGMA journal_mode
.............
11-03 16:58:23.928 12265-12265/? E/SQLiteOpenHelper: Couldn't open ICShopper for writing (will try read-only):
android.database.sqlite.SQLiteDatabaseCorruptException: file is encrypted or is not a database (code 26): , while compiling: PRAGMA journal_mode
'''''''''''''
11-03 16:58:23.929 12265-12265/? E/SQLiteLog: (26) statement aborts at 1: [PRAGMA user_version;] file is encrypted or is not a database
11-03 16:58:23.930 12265-12265/? I/mjt.shopper: Thu Nov 03 16:58:23 AEDT 2016 Activity=MainDataHandling Method=dataBaseIntegrityCheck MSG=DB onCorruption error handler invoked
11-03 16:58:23.934 12265-12265/? D/AndroidRuntime: Shutting down VM
11-03 16:58:23.934 12265-12265/? E/AndroidRuntime: FATAL EXCEPTION: main
Process: mjt.shopper, PID: 12265
android.database.sqlite.SQLiteDatabaseCorruptException: file is encrypted or is not a database (code 26)
DatabaseHelper 代码是:-
public class IntegrityCheckDBHelper extends SQLiteOpenHelper implements DatabaseErrorHandler{
public static final String DATABASE_NAME = "IC"+ShopperDBHelper.DATABASE_NAME;
public static final int DATABASE_CORRUPTED = 1;
private static int databasestate = 0;
private Context context;
public IntegrityCheckDBHelper(Context context,
String name,
SQLiteDatabase.CursorFactory factory,
int version, DatabaseErrorHandler errorHandler) {
super(context, DATABASE_NAME,factory,1,errorHandler);
this.context = context;
};
public void onCreate(SQLiteDatabase db) {};
public void onUpgrade(SQLiteDatabase db, int oldversion, int newversion) {};
public void onCorruption(SQLiteDatabase db) {
}
public boolean checkDB() {
SQLiteDatabase icdb = this.getReadableDatabase();
String icsqlstr = " PRAGMA quick_check";
Cursor iccsr;
iccsr = icdb.rawQuery(icsqlstr,null);
return false;
}
public static void setDatabaseCorrupted() {
databasestate = DATABASE_CORRUPTED;
}
public boolean isDatabaseCouurpted() {
if(databasestate != 0) return false;
return true;
}
}
注意!这个助手专门用于检查恢复文件是否可以被用户使用(所以不需要 onCreate
/onUpgrade
做任何事情我认为)。
这是相关代码,即 dataBaseIntegrityCheck 方法(即从要恢复的备份创建数据库文件以检查备份是否创建有效数据库):-
private boolean dataBaseIntegrityCheck() {
final String THIS_METHOD = "dataBaseIntegrityCheck";
String sqlstr_mstr = "SELECT name FROM sqlite_master WHERE type = 'table' AND name!='android_metadata' ORDER by name;";
Cursor iccsr;
boolean rv = true;
DatabaseErrorHandler myerrorhandler = new DatabaseErrorHandler() {
@Override
public void onCorruption(SQLiteDatabase sqLiteDatabase) {
mjtUtils.logMsg(mjtUtils.LOG_INFORMATIONMSG,"DB onCorruption error handler invoked",THIS_ACTIVITY,THIS_METHOD,true);
dbcorrupted = true;
}
};
mjtUtils.logMsg(mjtUtils.LOG_INFORMATIONMSG,"Restore Databae Integrity Check - Starting",THIS_METHOD,THIS_ACTIVITY,true);
try {
FileInputStream bkp = new FileInputStream(backupfilename);
OutputStream ic = new FileOutputStream(icdbfilename);
while ((copylength = bkp.read(buffer)) > 0) {
ic.write(buffer, 0, copylength);
}
ic.close();
bkp.close();
mjtUtils.logMsg(mjtUtils.LOG_INFORMATIONMSG,"restore Database Integrity Check - IC Database created",THIS_METHOD,THIS_ACTIVITY,true);
//Note SQLite will actually check for corruption and if so delete the file
IntegrityCheckDBHelper icdbh = new IntegrityCheckDBHelper(this,null,null,1,myerrorhandler);
//>>>>>>>>>>>>> Errors all point here (the getReadableDatabase)
SQLiteDatabase icdb = icdbh.getReadableDatabase();
if(dbcorrupted) {
mjtUtils.logMsg(mjtUtils.LOG_INFORMATIONMSG,"DB corrupted",THIS_ACTIVITY,THIS_METHOD,true);
return false;
}
//Check to see if there are any tables, if wrong file type shouldn't be any
iccsr = icdb.rawQuery(sqlstr_mstr,null);
if(iccsr.getCount() < 1) {
errlist.add("Integrity Check extract from sqlite_master returned nothing - Propsoed file is corrupt or not a database file.");
rv = false;
}
iccsr.close();
icdb.close();
} catch (IOException e) {
e.printStackTrace();
errlist.add("Integrity Check Failed Error Message was " + e.getMessage());
}
if(!rv) {
// AlertDialog removed.
}
return rv;
}
重申一下,问题主要是关于 DatabaseErrorHandler 以及我能做什么、不能做什么和/或应该做什么。
我找到的文档以及我看过的许多帖子似乎都没有帮助。
最佳答案
SQLiteDatabase.open()
中的相关代码如下所示:
try {
openInner();
} catch (SQLiteDatabaseCorruptException ex) {
onCorruption();
openInner();
}
因此您的onCorruption()
处理程序必须在返回之前恢复数据库;这不能拖到以后。
如果您实际上不想恢复您尝试打开的数据库,则使用 onCorrupt()
处理程序没有意义。
关于android - 在 SQLite DatabaseErrorHandler 中需要做什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40395192/
我有一个关于 JavaScript 语法的问题。实际上,我在自学 MEAN 堆栈教程时想出了编码(https://thinkster.io/mean-stack-tutorial#adding-aut
在我的书中它使用了这样的东西: for($ARGV[0]) { Expression && do { print "..."; last; }; ... } for 循环不完整吗?另外,do 的意义何
我已经编写了读取开关状态的代码,如果按 3 次 # 则退出。 void allkeypadTest(void) { static uint8_t modeKeyCount=0; do
因此,对于上周我必须做的作业,我必须使用 4 个 do-while 循环和 if 语句在 Java 中制作一个猜谜游戏。我无法成功完成它,类(class)已经继续,没有为我提供任何帮助。如果有人可以查
int i=1,j=0,n=10,k; do{ j+=i; i<<1; printf("%d\n",i); // printf("%d\n",12<<1); }while
此代码用于基本杂货计算器的按钮。当我按下按钮时,一个输入对话框会显示您输入商品价格的位置。我遇到的问题是我无法弄清楚如何获得 do ... while 循环以使输入对话框在输入后弹出。 我希望它始终恢
当我在循环中修改字符串或另一个变量时,它的条件是否每次都重新计算?或者在循环开始前一次 std::string a("aa"); do { a = "aaaa"; } while(a.size<10)
我刚刚写了这个,但我找不到问题。我使用代码块并编写了这个问题 error: expected 'while' before '{' token === Build finished: 1 errors
do { printf("Enter number (0-6): ", ""); scanf("%d", &Num); }while(Num >= 0 && Num 表示“超过”,<表
我有一个包含 10 个项目的 vector (为简单起见,所有项目都属于同一类,称其为“a”)。我想要做的是检查“A”不是 a) 隐藏墙壁或 b) 隐藏另一个“A”。我有一个碰撞函数可以做到这一点。
嗨,这是我的第二个问题。我有下表 |-----|-------|------|------| |._id.|..INFO.|.DONE.|.LAST.| |..1..|...A...|...N..|.
这个问题在这里已经有了答案: 关闭 12 年前。 Possible Duplicates: Why are there sometimes meaningless do/while and if/e
来自 wikibook在 F# 上有一小部分它说: What does let! do?# let! runs an async object on its own thread, then it i
我在 Real World Haskell 书中遇到了以下函数: namesMatching pat | not (isPattern pat) = do exists do
我有一个类似于下面的用例,我创建了多个图并使用 gridExtra 将它们排列到一些页面布局中,最后使用 ggsave 将其保存为 PDF : p1 % mutate(label2
当我使用具有 for 循环的嵌套 let 语句时,如果没有 (do (html5 ..)),我将无法运行内部 [:tr]。 (defpartial column-settings-layout [&
执行 vagrant up 时出现此错误: anr@anr-Lenovo-G505s ~ $ vagrant up Bringing machine 'default' up with 'virtua
# ################################################# # Subroutine to add data to the table Blas
我想创建一个检查特定日期格式的读取主机。此外,目标是检查用户输入是否正确,如果不正确,则提示应再次弹出。 当我刚接触编程时,发现了这段代码,这似乎很合适。我仍然在努力“直到” do {
我关注这个tutorial在谷歌云机器学习引擎上进行培训。我一步一步地跟着它,但是在将 ml 作业提交到云时我遇到了错误。我运行了这个命令。 sam@sam-VirtualBox:~/models/r
我是一名优秀的程序员,十分优秀!