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

 

发布了51 篇原创文章 · 获赞 2 · 访问量 5万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章