Android(java):database disk image is malformed (code 11)

本文介绍了一个用于Android应用中的SQLite数据库助手类实现细节。该类提供了数据库创建、升级及读写操作的方法,并演示了如何执行SQL语句进行数据增删改查及事务处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public class DatabaseHelper extendsSQLiteOpenHelper {

    //类没有实例化,是不能用作父类构造器的参数,必须声明为静态

         private static final String name = "bob";//数据库名称

         private static finalint version = 1; //数据库版本

 

private static SQLiteDatabase readableDB;

private static SQLiteDatabase writableDB;
  

         public DatabaseHelper(Context context) {

//第三个参数CursorFactory指定在执行查询时获得一个游标实例的工厂类,设置为null,代表使用系统默认的工厂类

                super(context, name, null, version);

         }

        @Override public void onCreate(SQLiteDatabasedb) {

              db.execSQL("CREATE TABLE IF NOT EXISTS person (personid integer primary key autoincrement, namevarchar(20), age INTEGER)");  

         }

        @Override public void onUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion) {

               db.execSQL("DROP TABLE IF EXISTS person");

               onCreate(db);

         }

 

 public SQLiteDatabase getReadableDatabase(Context context) {
  if(readableDB == null){
   readableDB = getReadableDatabase();
  }
  return readableDB;
 }

public SQLiteDatabase getWritableDatabase(Context context) {

  if(writableDB== null){
      writableDB = getWritableDatabase();
  }
  return writableDB;
 }
  
 public static void closeDB(){
  
  if(readableDB != null&&readableDB.isOpen()) {
   readableDB.close();
   readableDB = null;
  }

  if(writableDB!= null&&writableDB.isOpen()) {
   writableDB.close();
   writableDB= null;
  }

 }

 

 

}

上面onUpgrade()方法在数据库版本每次发生变化时都会把用户手机上的数据库表删除,然后再重新创建。一般在实际项目中是不能这样做的,正确的做法是在更新数据库表结构时,还要考虑用户存放于数据库中的数据不会丢失。

getWritableDatabase()getReadableDatabase()方法都可以获取一个用于操作数据库的SQLiteDatabase实例。但getWritableDatabase() 方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写,倘若使用getWritableDatabase()打开数据库就会出错。getReadableDatabase()方法先以读写方式打开数据库,如果数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库。

 

SQLiteDatabasedb = ....;

db.execSQL("insert into person(name, age) values(?,?)", new Object[]{"bob", 4});

db.close();

 

SQLiteDatabasedb = ....;

Cursor cursor =db.rawQuery(“select * from person”, null);

while (cursor.moveToNext()) {

  intpersonid =cursor.getInt(0);//获取第一列的值,第一列的索引从0开始

  String name =cursor.getString(1);//获取第二列的值

  int age =cursor.getInt(2);//获取第三列的值

}

cursor.close();

db.close();

 

 SQLiteDatabasedb = ....;

db.beginTransaction();//开始事务

try {

    db.execSQL("insert into person(name, age) values(?,?)", new Object[]{"bob", 4});

    db.execSQL("update person set name=? wherepersonid=?", new Object[]{"bob", 1});

    db.setTransactionSuccessful();//调用此方法会在执行到endTransaction()时提交当前事务,如果不调用此方法会回滚事务

} finally {

    db.endTransaction();//由事务的标志决定是提交事务,还是回滚事务

}

db.close();

 

### 解决 SVN SQLite 数据库磁盘映像损坏 (S11) 的方法 当遇到 `sqlite[S11]: database disk image is malformed` 错误时,可以通过多种方式尝试修复此问题。以下是几种常见的解决方案: #### 方法一:删除并重新检出工作副本 最简单的方法是完全移除当前的工作副本,并从版本库中重新检出最新的代码。这种方法虽然直接有效,但在大型项目中可能会耗费较多时间。 ```bash rm -rf /path/to/working/copy svn checkout https://repository-url/path/to/project ``` #### 方法二:替换 `.svn/wc.db` 文件 如果团队成员中有其他人的本地仓库正常运作,则可以从其处获取未受损的 `.svn/wc.db` 文件作为替代品。只需确保源文件来自相同版本的 Subversion 客户端安装[^2]。 #### 方法三:利用 SQLite 工具执行数据库维护命令 通过运行特定 SQL 命令来尝试恢复已损毁的数据结构。具体步骤如下所示: 1. 下载最新版的 SQLite 工具包[^5]; 2. 将解压后的 `sqlite3.exe` 文件放置于包含 `.svn` 隐藏文件夹的位置; 3. 打开终端窗口,切换至上述路径; 4. 输入下列指令逐一回车确认: ```sql sqlite3 .svn/wc.db "PRAGMA integrity_check" sqlite3 .svn/wc.db "REINDEX nodes" sqlite3 .svn/wc.db "REINDEX pristine" ``` 这些操作有助于检测潜在的问题以及重建索引以提高性能稳定性。 #### 方法四:清理锁定记录与队列任务表单 进入 SQLite 控制台模式后,可针对两个关键表格——`wc_lock` 和 `work_queue` 实施数据清除动作。这一步骤能够解除因锁机制引发的操作阻碍状况。 ```sql delete from wc_lock; delete from work_queue; ``` 完成以上更改之后记得提交事务变更以便生效[^3]。 #### 方法五:导出再导入完整的数据库脚本 最后一种较为激进的方式涉及创建现有内容备份副本,随后将其迁移到全新的空白实例之中。流程概述如下: 1. 启动 SQLite 终端界面; 2. 设置输出格式为插入语句形式; 3. 导出全部对象定义及其关联数据集; 4. 关闭连接退出程序; 5. 移走旧有的数据库实体; 6. 创建新的空置容器等待填充; 7. 加载先前准备完毕的转储文档; 8. 结束整个过程恢复正常服务状态。 ```sql sqlite3 .svn/wc.db .mode insert .output dump_all.sql .dump .exit mv .svn/wc.db .svn/wc-corrupt.db sqlite3 .svn/wc.db .read dump_all.sql .exit ``` 这种方式理论上能最大限度保留原始信息完整性的同时实现故障排除目的[^4]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值