小米开源文件管理器MiCodeFileExplorer-源码研究(7)-Favorite收藏管理和SQLite数据库CRUD
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的更多相关文章
- 小米开源文件管理器MiCodeFileExplorer-源码研究(0)-初步研究
2011年对着书本Android应用开发揭秘,写了2个月的HelloWorld. 现在想复习并深入,我没有耐心再去一点点地敲代码了. 4年前自己是个学生,实习,现在有工作,只能业余时间研究. ...
- Android开源项目 Universal imageloader 源码研究之Lru算法
https://github.com/nostra13/Android-Universal-Image-Loader universal imageloader 源码研究之Lru算法 LRU - Le ...
- 小米开源文件管理器MiCodeFileExplorer-源码研究(1)-2个模型Model
上篇说到,把小米的Java代码整理成了5个包,其中1个是net.micode.fileexplorer.model.这个包就2个模型类,最基本了,FileInfo和FavoriteItem. pack ...
- 小米开源文件管理器MiCodeFileExplorer-源码研究(5)-AsyncTask异步任务
说明:本文的文字和代码,主要来自于网上的2篇文章. 第4篇的时候,提到了异步任务AsyncTask. 网上找了2篇文章学习下,copy网友的代码,稍微改了几个字,运行成功了. 在开发Android移动 ...
- 开源播放器ijkplayer源码结构
ijkplayer核心源码主要在ijkmedia文件夹下ijkplayer.ijksdl及ijkutils. 注:tag k0.3.1 player: remove ijkutil android相关 ...
- 小米开源文件管理器MiCodeFileExplorer-源码研究(9)-入口分析
AndroidManifest.xml是Android应用程序最重要的配置文件. 入口文件和intent-filter <application android:icon="@draw ...
- 小米开源文件管理器MiCodeFileExplorer-源码研究(6)-媒体文件MediaFile和文件类型MimeUtils
接着之前的第4篇,本篇的2个类,仍然是工具类.MediaFile,媒体文件,定义了一大堆的常量,真正的有用的方法就几个.isAudioFileType.isVideoFileType之类的. Mime ...
- 小米开源文件管理器MiCodeFileExplorer-源码研究(2)-2个单实例工具类
从本篇开始,讲解net.micode.fileexplorer.util工具包中的类.这个包下的类,功能也比较单一和独立.很多代码的思想和实现,可以用于JavaWeb和Android等多种环境中. 一 ...
- 小米开源文件管理器MiCodeFileExplorer-源码研究(3)-使用最多的工具类Util
Util.java,使用最广泛~代码中很多地方,都写了注释说明~基本不需要怎么解释了~ package net.micode.fileexplorer.util; import java.io.Fil ...
随机推荐
- Hyper-V 导入与导出虚拟机
虚拟机的导入与导出功能可以将虚拟机通过文件的方式进行转移,可以将虚拟机的文件复制到活动硬盘,然后带到其他的地点进行导入,这样方便了虚拟机的跨地域的转移.但是有一点要注意,所有要转移的虚拟机都必须处于停 ...
- 第一章、zabbix安装
前言: 注意:本文不涉及性能测试.性能优化中的监控,所有文字的出发点都是日常运维监控. 在开始之前,我们还是先统一下认识:要监控一个对象,需要掌握哪些东西呢? 监控对象的理解:要监控的对象你是否了解呢 ...
- WPF模仿QQ登录按钮
原文:WPF模仿QQ登录按钮 如下图,第一张是未点击时按钮样式,第二张是鼠标划过时按钮样式. 样式代码: <Style TargetType="{x:Type Button}" ...
- 协变 & 逆变
都跟里氏替换原则有关. 协变:你可以用一个子类对象去替换相应的一个父类对象,这是完全符合里氏替换原则的,和协(谐)的变.如:用Swan替换Bird. 逆变:你可以用一个父类对象去替换相应的一个子类对象 ...
- 剑指Offer面试题27(Java版):二叉搜索树与双向链表
题目:输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建新的结点.仅仅能调整树中结点指针的指向. 比方例如以下图中的二叉搜索树.则输出转换之后的排序双向链表为: 在二叉树中,每一 ...
- Codeforces Round #105 (Div. 2) 148C Terse princess(脑洞)
C. Terse princess time limit per test 1 second memory limit per test 256 megabytes input standard in ...
- Gym - 100203H Highways 最小生成树
题意:平面上n个点修路,已经修好了m条,再修若干条使得点之间连通,求最小代价的方案. 思路:基本上是裸的最小生成树了,我这里存边直接存在multyset了,取的时候也比较方便,我本来就是这么考虑的,队 ...
- 局域网ARP病毒的清理
局域网ARP病毒的清理 作者:IT动力源 来源:IT动力源收集整理 现在局域网中感染ARP 病毒的情况比较多,清理和防范都比较困难,给不少的网络管理员造成了很多的困扰.下面就是个人在处理这个 ...
- C++包含头文件时尖括号和双引号区别
原文链接:http://c.biancheng.net/cpp/biancheng/view/66.html 如果你还看一些别的C++教程,那么你可能很早就发现了,有些书上的#include命令写作# ...
- 学习《零基础入门学习Python》电子书PDF+笔记+课后题及答案
初学python入门建议学习<零基础入门学习Python>.适合新手入门,很简单很易懂.前一半将语法,后一半讲了实际的应用. Python3入门必备,小甲鱼手把手教授Python,包含电子 ...