文件管理器源码分析(三)

//存储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
    @Override
    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;
    }
    //升级的时候,直接删除以前的数据库,如果存在的话
    @Override
    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;
    }
}
时间: 2024-08-29 07:22:03

文件管理器源码分析(三)的相关文章

文件管理器源码分析(一)

Aboutmillet file management source code analysis Openthe file manager millet, we will soon see the interface as shownbelow: Amongthem, will be a variety of document classification. And show thenumber of each file. Androidframework of the MediaStore h

文件管理器源码分析(五)

/** * 这个文件夹里面存储的内容是app2sd产生的文件夹,也就是是你手机上所有安装到SD卡的应用程序的缓存文件夹. * androidsecure文件夹可以删除吗? *如果删除之后,软件不能正常使用,和系统没有关系. *删的话除了会可能导致移动至sd卡的程序损坏,数据丢失,并不会造成什么严重后果. * 只要把移动到sd卡的损坏程序卸载,重装,手机就完全没有损伤,文件夹也会在再次app2sd时自动重建的. */ public class Util { private static Strin

文件管理器源码分析(二)

/** * 文件操作工具类,执行文件的创建.移动.粘贴.重命名.删除等 * 任务的异步执行和IOperationProgressListener. 拷贝和删除等操作,是比较费时的,采用了异步执行的方式~ http://blog.csdn.net/xufenghappy6/article/details/7343899 异步执行+事件通知 是一种比较流行的模式,比同步等待很多时候要好. */ public class FileOperationHelper { private static fin

linux调度器源码分析 - 初始化(二)

本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 引言 上期文章linux调度器源码分析 - 概述(一)已经把调度器相关的数据结构介绍了一遍,本篇着重通过代码说明调度器在系统启动初始化阶段是如何初始化和工作的.通过上期文章我们知道,在多核CPU和SMP系统中,每个CPU(多核COU中的每个核)都有自己的struct rq队列,而rq队列中又有着自己的struct cfs_rq和struct rt_rq.在初始化时就是对这三个结构进行初始化. init_tas

Nouveau源码分析(三):NVIDIA设备初始化之nouveau_drm_probe

Nouveau源码分析(三) 向DRM注册了Nouveau驱动之后,内核中的PCI模块就会扫描所有没有对应驱动的设备,然后和nouveau_drm_pci_table对照. 对于匹配的设备,PCI模块就调用对应的probe函数,也就是nouveau_drm_probe. // /drivers/gpu/drm/nouveau/nouveau_drm.c 281 static int nouveau_drm_probe(struct pci_dev *pdev, 282 const struct

[Android]Fragment源码分析(三) 事务

Fragment管理中,不得不谈到的就是它的事务管理,它的事务管理写的非常的出彩.我们先引入一个简单常用的Fragment事务管理代码片段: FragmentTransaction ft = this.getSupportFragmentManager().beginTransaction(); ft.add(R.id.fragmentContainer, fragment, "tag"); ft.addToBackStack("<span style="fo

baksmali和smali源码分析(三)

baksmali 的源码分析 在baksmali进行源码分析之前,需要读者掌握一条主线,因为本身笔者只是由于项目需要用到这套源码,在工作之余的时间里面来进行学习也没有时间和精力熟读源码的每个文件每个方法,但是依据这条主线,至少能够猜出并且猜对baksmali里面的源码的文件大概的作用是什么,这样在修改问题和移植的时候才能做到游刃有余. 这条主线是,baksmali其实只是利用了dexlib2提供的接口,将dex文件读入到一块内存中,这块内存或者说数据结构开辟的大小是跟输入的dex文件相关的,而这

横屏小游戏--萝莉快跑源码分析三

主角出场: 初始化主角 hero = new GameObjHero(); hero->setScale(0.5); hero->setPosition(ccp(100,160)); hero->setVisible(false); addChild(hero,1); 进入GameObjHero类ccp文件 创建主角及动作 this->setContentSize(CCSizeMake(85,90)); //接收触摸事件 CCDirector* pDirector = CCDire

linux调度器源码分析 - 运行(四)

本文为原创,转载请注明:http://www.cnblogs.com/tolimit/ 引言 之前的文章已经将调度器的数据结构.初始化.加入进程都进行了分析,这篇文章将主要说明调度器是如何在程序稳定运行的情况下进行进程调度的. 系统定时器 因为我们主要讲解的是调度器,而会涉及到一些系统定时器的知识,这里我们简单讲解一下内核中定时器是如何组织,又是如何通过通过定时器实现了调度器的间隔调度.首先我们先看一下内核定时器的框架 在内核中,会使用strut clock_event_device结构描述硬件