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

最新文章

  1. JuQueen(线段树 lazy)
  2. Log4net介绍
  3. 【原】SparkContex源码解读(二)
  4. dsplib使用备忘
  5. 这是一个简单的前台短信验证码功能 ajax实现异步处理 (发送和校验)
  6. linux下oracle启动关闭
  7. 技术分享:RxJS实战练习-经典游戏Breakout
  8. Uva 12009 平方数尾数与自身同样 dfs 构造
  9. HTTP请求处理流程 MVC核心(MVC就是扩展了一个HttpModule)
  10. html页面小技巧
  11. Retrofit2+Rxjava+OkHttp的使用和网络请求
  12. Docker 私有registry出现的证书问题
  13. JS中给函数参数添加默认值
  14. [转]ASP.NET MVC 5 - 给数据模型添加校验器
  15. 【翻译自mos文章】job 不能自己主动运行的解决方法
  16. [New Learn] RunLoop学习-官方译文
  17. I.MX6 recovery mode hacking
  18. ESLint在vue中的使用
  19. 《从零开始学Swift》学习笔记(Day4)——用Playground工具编写Swift
  20. 《Vim实用技巧》第2版读书笔记

热门文章

  1. NodeJS学习笔记 (30)定时器-timers
  2. 用Electron开发企业网盘(二)--分片下载
  3. ifsta---统计网络接口活动状态
  4. [React Native] Use the SafeAreaView Component in React Native for iPhone X Compatibility
  5. 理解Linq查询
  6. HUE配置文件hue.ini 的filebrowser模块详解(图文详解)(分HA集群和非HA集群)
  7. Visual studio 之常见编译错误(1):syntax error : missing ';' before identifier 'PVOID64'
  8. 利用Python网络爬虫抓取微信好友的签名及其可视化展示
  9. angularjs之手机输入法回车变搜索,并触发事件,兼容pc回车事件
  10. cogs 32. [POI1999] 位图