Android SQLite操作之“SQLiteOpenHelper”

最近在寫Android SQLite,第一次用了SQLiteDatabase,這一次用SQLiteOpenHelper。還是用Android Studio,查看數據庫的軟件是SQLite Expert Personal 4.x 傳送門:http://www.sqliteexpert.com/download.html
具體操作見《Android對SQLite的”增刪改查”——SQLiteDatabase》
SQLiteOpenHelper使用很靈活,版本號、數據庫名稱和光標位置都可以在MainActivity中獲取,也可以在DBHelp(繼承SQLiteOpenHelper的類)中設定。

public SQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
}

例:在MainActivity中獲取數據庫名稱,版本預設1

 public DBHelp(Context context,String name) {
        super(context, name, null, 1);
    }

那麼MainActivity就要傳一個名稱過來:

 dbHelp = new DBHelp(MainActivity.this,"Zhan.db");

如果是DBHelp中設定的參數,那麼傳值就不需要了

 public static String DB_Name = "Zhan.db";
 public static int DB_Version = 1;
    public DBHelp(Context context) {
        super(context, DB_Name, null, DB_Version);
    }

MainActivity中代碼:

 dbHelp = new DBHelp(MainActivity.this);

SQLiteOpenHelper自帶兩個方法,一個是onCreate: 程序自動調用,用作創建數據庫。若database文件夾中已經存在數據庫時,則不會調用此方法。值得注意的是,僅僅生成DataBaseHelper對象(SQLiteOpenHelper類型)的時候是不會調用該函數的,也就是說

 dbHelp = new DBHelp(MainActivity.this);

這句語句並不會讓程序自動調用onCreate方法。我們在後面必須得跟getWritableDatabasegetReadableDatabase。就像這樣:

dbHelp = new DBHelp(MainActivity.this);
db = dbHelp.getWritableDatabase();

然後onCreate中再寫創建表格的語句,這樣才能被執行。

public void onCreate(SQLiteDatabase db) {
        String sql = "CREATE TABLE IF NOT EXISTS Zhan (_id INTEGER PRIMARY KEY AUTOINCREMENT, 
                                                                                name VARCHAR, 
                                                                                age INTEGER)";
        db.execSQL(sql);
        System.out.println("finish creat table");
    }

第二個是onUpgrade(SQLiteDatabase db, int DB_OldVersion, int DB_NewVersion):用於升級軟件時更新數據庫表結構,如增加表、列字段等操作。
提示一下,在升級前,最好對原有數據進行備份,在新表建好後把數據導入新表中。
寫到這裏,又出現了兩個方法getWritableDatabase() 和getReadableDatabase()。
兩個方法的介紹在百度知道上已經解釋的很清楚了。
這裏寫圖片描述
這樣看來似乎getReadableDatabase更安全一些。
除了上述的兩種方法,我們還可以在BDHelp這個類裏面寫自己的方法。比如數據的“增刪改查”。這就把SQLite的功能都獨立出來了,對後期的維護比較方便,如果出現錯誤並且是SQLite出錯了,只要看DBHelp就好了,不需要在一堆雜亂無章的代碼中找錯誤。雖然這個工程並不是典型的MVC設計模式,但還是可以看得出MVC的影子。

public void Insert() {
        SQLiteDatabase db = this.getWritableDatabase();     //獲取數據庫實例
        db.execSQL("INSERT INTO Zhan (_id,name,age)"+" VALUES(1,'Zhan',8)");
        db.execSQL("INSERT INTO Zhan VALUES (2,?,?)", new Object[]{"abc",21});
        db.execSQL("INSERT INTO Zhan (_id, name, age) VALUES (?, 'xyz', 22)");
        db.execSQL("INSERT INTO Zhan VALUES (6,'Michael',9)");
    }
public void Delete(String s){
        SQLiteDatabase db = this.getReadableDatabase();
        db.execSQL("DELETE FROM Zhan WHERE name = ?",new Object[]{ s });
    }

這裏就放了兩段代碼,具體的“增刪改查”怎麼寫,可以參考本人所寫的《Android對SQLite的”增刪改查”——SQLiteDatabase》。其中的SQL語句其實都是一樣的。
那我們看一下,這邊的兩段代碼實現了什麼功能。第一個插入數據,是往表格中插入4條數據。
這裏寫圖片描述
第二個刪除是刪除name爲xyz的記錄。
這裏寫圖片描述
最終只剩下三條記錄。
文章的最後,我們看一下整個工程文件
1、繼承SQLiteOpenHelper的類DBHelp
這裏寫圖片描述
2、MainActivity
這裏寫圖片描述


參考資料:SQLiteOpenHelper SQLiteDatabase ContentProvider三者的關係
getWritableDatabase() 和getReadableDatabase()操作上有什麼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章