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;
}
}

小米开源文件管理器MiCodeFileExplorer-源码研究(7)-Favorite收藏管理和SQLite数据库CRUD的更多相关文章

  1. 小米开源文件管理器MiCodeFileExplorer-源码研究(0)-初步研究

    2011年对着书本Android应用开发揭秘,写了2个月的HelloWorld.   现在想复习并深入,我没有耐心再去一点点地敲代码了.   4年前自己是个学生,实习,现在有工作,只能业余时间研究. ...

  2. Android开源项目 Universal imageloader 源码研究之Lru算法

    https://github.com/nostra13/Android-Universal-Image-Loader universal imageloader 源码研究之Lru算法 LRU - Le ...

  3. 小米开源文件管理器MiCodeFileExplorer-源码研究(1)-2个模型Model

    上篇说到,把小米的Java代码整理成了5个包,其中1个是net.micode.fileexplorer.model.这个包就2个模型类,最基本了,FileInfo和FavoriteItem. pack ...

  4. 小米开源文件管理器MiCodeFileExplorer-源码研究(5)-AsyncTask异步任务

    说明:本文的文字和代码,主要来自于网上的2篇文章. 第4篇的时候,提到了异步任务AsyncTask. 网上找了2篇文章学习下,copy网友的代码,稍微改了几个字,运行成功了. 在开发Android移动 ...

  5. 开源播放器ijkplayer源码结构

    ijkplayer核心源码主要在ijkmedia文件夹下ijkplayer.ijksdl及ijkutils. 注:tag k0.3.1 player: remove ijkutil android相关 ...

  6. 小米开源文件管理器MiCodeFileExplorer-源码研究(9)-入口分析

    AndroidManifest.xml是Android应用程序最重要的配置文件. 入口文件和intent-filter <application android:icon="@draw ...

  7. 小米开源文件管理器MiCodeFileExplorer-源码研究(6)-媒体文件MediaFile和文件类型MimeUtils

    接着之前的第4篇,本篇的2个类,仍然是工具类.MediaFile,媒体文件,定义了一大堆的常量,真正的有用的方法就几个.isAudioFileType.isVideoFileType之类的. Mime ...

  8. 小米开源文件管理器MiCodeFileExplorer-源码研究(2)-2个单实例工具类

    从本篇开始,讲解net.micode.fileexplorer.util工具包中的类.这个包下的类,功能也比较单一和独立.很多代码的思想和实现,可以用于JavaWeb和Android等多种环境中. 一 ...

  9. 小米开源文件管理器MiCodeFileExplorer-源码研究(3)-使用最多的工具类Util

    Util.java,使用最广泛~代码中很多地方,都写了注释说明~基本不需要怎么解释了~ package net.micode.fileexplorer.util; import java.io.Fil ...

随机推荐

  1. Gradle编译spring3.x报错找不到itextpdf4.2.2解决方案

    google搜到一篇文章:http://www.bdtool.net/blog_356.html 试了文章里的两个方法,方法一不行,方法二有点搞头,但是还有些错.试着试着,突然成功了~ 我是这么做的 ...

  2. 协变 & 逆变

    都跟里氏替换原则有关. 协变:你可以用一个子类对象去替换相应的一个父类对象,这是完全符合里氏替换原则的,和协(谐)的变.如:用Swan替换Bird. 逆变:你可以用一个父类对象去替换相应的一个子类对象 ...

  3. 数据格式转换 (三)Office文档转HTML

         HTML Filter 是由北京红樱枫软件有限公司根据HTML Ver 4.01/CSS式样,研制和开发的MS Office系列文档到HTML转换的通用程序库.便于用户实现对多种文档的统一管 ...

  4. Connect the Campus (Uva 10397 Prim || Kruskal + 并查集)

    题意:给出n个点的坐标,要把n个点连通,使得总距离最小,可是有m对点已经连接,输入m,和m组a和b,表示a和b两点已经连接. 思路:两种做法.(1)用prim算法时,输入a,b.令mp[a][b]=0 ...

  5. Pretty UI Design For Android -- 滑动背景、透明列表

    本文是从国外一个网上看到的效果.感觉非常不错.就简化了一下代码.拿来用了,先看下效果图: 效果还是非常不错的,以下让我们看看是如何实现的: 看看文字来源,非常easy,是一个数组: <?xml ...

  6. 基于MVC4+EasyUI的Web开发框架经验总结(13)--DataGrid控件实现自己主动适应宽带高度

    在默认情况下,EasyUI的DataGrid好像都没有具备自己主动宽度的适应功能,通常是指定像素宽度的.可是使用的人员计算机的屏幕分辨率可能不一样,因此导致有些地方显示太大或者太小,总是不能达到好的预 ...

  7. 换主页轮播的主题图片(4、删除)---轻开电子商务系统(企业入门级B2C站点)

    接(  换主页轮播的主题图片1 ) 文件:site/links/img0.html中的表单(第11行最后一个td) <td><if x="@{sys:canDo}" ...

  8. 添加使用session回话属性

    @SessionAttributes("nowUser") nowUser :id/userName/password public String delectMsg(int id ...

  9. Gym - 100203H Highways 最小生成树

    题意:平面上n个点修路,已经修好了m条,再修若干条使得点之间连通,求最小代价的方案. 思路:基本上是裸的最小生成树了,我这里存边直接存在multyset了,取的时候也比较方便,我本来就是这么考虑的,队 ...

  10. C# Aspose.Cells 使用汇总

    Workbook workbook = new Workbook(); //工作簿 Worksheet sheet = workbook.Worksheets[0]; //工作表 Cells cell ...