小米開原始檔管理器MiCodeFileExplorer-原始碼研究(7)-Favorite收藏管理和SQLite資料庫CRUD

小雷FansUnion發表於2015-10-29

FavoriteDatabaseHelper,儲存favorite資料,到SQLite資料庫。
SQLiteOpenHelper是一個幫助管理資料庫和版本的工具類。
通過繼承並過載方法,快速實現了我們自己的Favorite表的CRUD。
怎麼感覺和FileOperationHelper類似,仍然是CRUD,只不過1個是資料庫中的,1個是檔案的。
程式碼比較簡單,每個函式的功能比較單一清晰,CRUD,主要是使用android.database.sqlite.SQLiteDatabase操作SQLite資料庫。


package net.micode.fileexplorer.util;


import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
//儲存favorite資料,到資料庫
//SQLiteOpenHelper是一個幫助管理資料庫和版本的工具類。
//通過繼承並過載方法,快速實現了我們自己的Favorite表的CRUD。
//怎麼感覺和FileOperationHelper類似,仍然是CRUD,只不過1個是資料庫中的,1個是檔案的。
public class FavoriteDatabaseHelper extends SQLiteOpenHelper {


	//下面6個欄位是資料庫的名字和版本號、表的名字和3個欄位
    private final static String DATABASE_NAME = "file_explorer";


    private final static int DATABASE_VERSION = 1;


    private final static String TABLE_NAME = "favorite";


    public final static String FIELD_ID = "_id";


    public final static String FIELD_TITLE = "title";


    public final static String FIELD_LOCATION = "location";


    private boolean firstCreate;


    //資料庫變化的時候,會通知其它監聽器
    private FavoriteDatabaseListener mListener;


    private static FavoriteDatabaseHelper instance;


    public interface FavoriteDatabaseListener {
        void onFavoriteDatabaseChanged();
    }


    //這個構造方法和下面的靜態獲得例項的方法,不太和諧啊~
    //乍一看,以為是單例模式呢,實則不是~
    public FavoriteDatabaseHelper(Context context, FavoriteDatabaseListener listener) {
        super(context, DATABASE_NAME, null, DATABASE_VERSION);
        instance = this;
        mListener = listener;
    }


    //這個地方感覺只是方便儲存了一個類的例項,但不能保證這個類只有1個例項
    public static FavoriteDatabaseHelper getInstance() {
        return instance;
    }


    //資料庫建立,1個sql
    public void onCreate(SQLiteDatabase db) {
        String sql = "Create table " + TABLE_NAME + "(" + FIELD_ID + " integer primary key autoincrement,"
                + FIELD_TITLE + " text, " + FIELD_LOCATION + " text );";
        db.execSQL(sql);
        firstCreate = true;
    }


    //升級的時候,直接刪除以前的資料庫,如果存在的話
    //版本號,沒用上啊
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        String sql = " DROP TABLE IF EXISTS " + TABLE_NAME;
        db.execSQL(sql);
        onCreate(db);
    }


    //是否為第1次建立
    public boolean isFirstCreate() {
        return firstCreate;
    }


    //判斷1個檔案路徑是否已經存在,或者說是否是Favorite檔案
    public boolean isFavorite(String path) {
        String selection = FIELD_LOCATION + "=?";
        String[] selectionArgs = new String[] {
            path
        };
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.query(TABLE_NAME, null, selection, selectionArgs, null, null, null);
        if (cursor == null)
            return false;
        boolean ret = cursor.getCount() > 0;
        cursor.close();
        return ret;
    }


    //獲得Favorite表的遊標
    public Cursor query() {
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.query(TABLE_NAME, null, null, null, null, null, null);
        return cursor;
    }


    //插入一條記錄
    public long insert(String title, String location) {
        if (isFavorite(location))
            return -1;


        SQLiteDatabase db = this.getWritableDatabase();
        long ret = db.insert(TABLE_NAME, null, createValues(title, location));
        mListener.onFavoriteDatabaseChanged();
        return ret;
    }


    //根據id,刪除一條記錄。如果需要,然後通知相關監聽器
    public void delete(long id, boolean notify) {
        SQLiteDatabase db = this.getWritableDatabase();
        String where = FIELD_ID + "=?";
        String[] whereValue = {
            Long.toString(id)
        };
        db.delete(TABLE_NAME, where, whereValue);


        if (notify)
            mListener.onFavoriteDatabaseChanged();
    }


    //根據位置刪除1條記錄,一定通知相關監聽器
    public void delete(String location) {
        SQLiteDatabase db = this.getWritableDatabase();
        String where = FIELD_LOCATION + "=?";
        String[] whereValue = {
            location
        };
        db.delete(TABLE_NAME, where, whereValue);
        mListener.onFavoriteDatabaseChanged();
    }


    //更新1條記錄
    public void update(int id, String title, String location) {
        SQLiteDatabase db = this.getWritableDatabase();
        String where = FIELD_ID + "=?";
        String[] whereValue = {
            Integer.toString(id)
        };
        db.update(TABLE_NAME, createValues(title, location), where, whereValue);
        mListener.onFavoriteDatabaseChanged();
    }


    private ContentValues createValues(String title, String location) {
        ContentValues cv = new ContentValues();
        cv.put(FIELD_TITLE, title);
        cv.put(FIELD_LOCATION, location);
        return cv;
    }
}

相關文章