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

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();

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值