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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章