sqlite简单封装
来源:互联网 发布:2016新开淘宝运营教程 编辑:程序博客网 时间:2024/06/05 03:41
作者:今天来跟大家说一个sqlite的简单封装,首先说一下通常情况下我们是怎样写自己的Sqlite,这里写出来是为了加深一下大家的印象,同时也是回顾一下,为那些不清楚Sqlite的同学打个基础;
Sqlite api调用
0.Dphelper
public class DBHelper extends SQLiteOpenHelper {
private static final String DB_NAME = "demo.db";//数据库名称
private static final int DB_VERSION = 1;//数据库版本号,这里升级数据库的时候会用到
public static final String TABLE_BOOK = "table_book";//表名
//表字段名
public static final String TABLE_BOOK_ID = "_id";//主键id
public static final String TABLE_BOOK_NAME = "name";//书本名字字段
public static final String TABLE_BOOK_AUTHOR = "author";//书本作者字段
public DBHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE " + TABLE_BOOK + " ("
+ TABLE_BOOK_ID + " varchar(50)"
+ TABLE_BOOK_NAME + " varchar(50)"
+ TABLE_BOOK_AUTHOR + " varchar(50))");//建表
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
}
1.实体类
2.定义接口
3.实现类
public class Book {
public String id;
public String name;
public String author;
}
public interface BookDao {
long insert(Book book);
int delete(String id);
int update(Book book);
List<Book> findAll();
}
public class BookDaoImpl implements BookDao{
private final SQLiteDatabase db;
public BookDaoImpl(Context context) {
DBHelper dbHelper = new DBHelper(context);
db = dbHelper.getWritableDatabase();
}
@Override
public long insert(Book book) {
ContentValues values = new ContentValues();
values.put(DBHelper.TABLE_BOOK_ID,book.id);
values.put(DBHelper.TABLE_BOOK_NAME,book.name);
values.put(DBHelper.TABLE_BOOK_AUTHOR,book.author);
return db.insert(DBHelper.TABLE_BOOK,null,values);
}
@Override
public int delete(String id) {
return db.delete(DBHelper.TABLE_BOOK,DBHelper.TABLE_BOOK_ID+"=?",new String[]{id});
}
@Override
public int update(Book book) {
ContentValues values = new ContentValues();
values.put(DBHelper.TABLE_BOOK_ID,book.id);
values.put(DBHelper.TABLE_BOOK_NAME,book.name);
values.put(DBHelper.TABLE_BOOK_AUTHOR,book.author);
return db.update(DBHelper.TABLE_BOOK,values,DBHelper.TABLE_BOOK_ID+"=?",new String[]{book.id});
}
@Override
public List<Book> findAll() {
Cursor cursor = db.query(DBHelper.TABLE_BOOK, null, null, null, null, null, null);
List<Book> books = null;
if(cursor!=null){
books = new ArrayList<>();
while (cursor.moveToNext()){
int columnIndex = cursor.getColumnIndex(DBHelper.TABLE_BOOK_NAME);
String columnContent = cursor.getColumnName(columnIndex);
Book book = new Book();
book.name = columnContent;
books.add(book);
}
}
cursor.close();
return books;
}
}
作者:不同业务都写接口,写实现类,费劲,如何偷懒?通用操作封装,屏蔽业务差别。差别在哪?
Sqlite-->增删改查。1.定义接口 2.抽取基类,实现通用操作 3.屏蔽bean对象区别
1..定义接口
public interface Dao<M> {
long insert(M m);
int delete(String id);
int update(M m);
List<M> findAll();
}
2.抽取基类,实现通用操作
public class BaseDao<M> implements Dao<M> {
private final SQLiteDatabase db;
private String primaryKey;
public BaseDao(Context context) {
DBHelper dbHelper = new DBHelper(context);
db = dbHelper.getWritableDatabase();
}
@Override
public long insert(M m) {
ContentValues values = fillColumns(m);
return db.insert(getTableName(), null, values);
}
@Override
public int delete(String id) {
return db.delete(getTableName(), getPrimaryKey() + "=?", new String[]{id});
}
@Override
public int update(M m) {
ContentValues values = fillColumns(m);
return db.update(getTableName(), values, getPrimaryKey() + "=?", new String[]{getPrimaryValue(m)});
}
@Override
public List<M> findAll() {
Cursor cursor = db.query(getTableName(), null, null, null, null, null, null);
List<M> list = null;
if (cursor != null) {
list = new ArrayList<>();
while (cursor.moveToNext()) {
M m = fillBean(cursor);
list.add(m);
}
}
cursor.close();
return list;
}
/**
* 根据实例对象获取表名
*
* @return
*/
public String getTableName() {
M m = getBean();
Table_Name annotation = m.getClass().getAnnotation(Table_Name.class);
if (annotation != null) {
return annotation.value();
}
return m.getClass().getSimpleName();
}
public String getPrimaryKey() {
M m = getBean();
Field[] declaredFields = m.getClass().getDeclaredFields();
for (Field field : declaredFields) {
field.setAccessible(true);
Table_Column annotation = field.getAnnotation(Table_Column.class);
if (annotation != null) {
boolean primarykey = annotation.primarykey();
if (primarykey) {
return annotation.value();
}
}
}
return "";
}
private String getPrimaryValue(M m) {
Field[] declaredFields = m.getClass().getDeclaredFields();
for (Field field : declaredFields) {
field.setAccessible(true);
Table_Column annotation = field.getAnnotation(Table_Column.class);
if (annotation != null) {
boolean primarykey = annotation.primarykey();
if (primarykey) {
try {
return field.get(m).toString();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
}
return "";
}
/**
* 将实例对象属性 对应到列,并对应赋值
*
* @param m
* @return
*/
private ContentValues fillColumns(M m) {
ContentValues values = new ContentValues();
Field[] declaredFields = m.getClass().getDeclaredFields();
for (Field field : declaredFields) {
field.setAccessible(true);
Table_Column annotation = field.getAnnotation(Table_Column.class);
if (annotation != null) {
String columnKey = annotation.value();
try {
String columnValue = field.get(m).toString();
values.put(columnKey, columnValue);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
return values;
}
private M fillBean(Cursor cursor) {
M m = getBean();
Field[] declaredFields = m.getClass().getDeclaredFields();
for (Field field : declaredFields) {
field.setAccessible(true);
Table_Column annotation = field.getAnnotation(Table_Column.class);
if (annotation != null) {
String columnKey = annotation.value();
int columnIndex = cursor.getColumnIndex(columnKey);
String columnContent = cursor.getColumnName(columnIndex);
try {
field.set(m, columnContent);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
// int columnIndex = cursor.getColumnIndex(DBHelper.TABLE_BOOK_NAME);
// String columnContent = cursor.getColumnName(columnIndex);
// M bean = getBean();
// bean.name = columnContent;
return m;
}
/**
* 根据泛型创建一个实例对象
*
* @return
*/
private M getBean() {
Type genericSuperclass = this.getClass().getGenericSuperclass();
if (genericSuperclass != null && genericSuperclass instanceof ParameterizedType) {
Type[] actualTypeArguments = ((ParameterizedType) genericSuperclass).getActualTypeArguments();
try {
return (M) ((Class) actualTypeArguments[0]).newInstance();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
return null;
}
}
需借助注解、反射
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
public @interface Table_Name {
String value();
}
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Table_Column {
String value();
boolean primarykey() default false;
}
@Table_Name(DBHelper.TABLE_BOOK)
public class Book {
@Table_Column(value = DBHelper.TABLE_BOOK_ID,primarykey = true)
public String id;
@Table_Column(DBHelper.TABLE_BOOK_NAME)
public String name;
@Table_Column(DBHelper.TABLE_BOOK_AUTHOR)
public String author;
}
作者:这个封装是用到了反射,这样做减少了代码量,不用说出现一个实体就要创建一个数据的管理类,如果你有更好的方法也可以分享给我哦
0 0
- C# SQLite 简单封装
- SQLite的简单封装
- sqlite简单封装
- android SQLite的简单封装
- 用C++简单封装了一下SQLite
- 简单封装FMDB操作sqlite的模板
- C++Windows下SQLite简单封装
- android Sqlite的简单封装和使用
- SQLite 封装
- sqlite封装
- ActiveSQLite更简单的Swift数据库方案(SQLite.swift封装)
- SQLite的封装类
- SQLite访问封装类
- C# 封装SQLite实现
- sqlite 操作与封装
- c++封装SQlite实例
- C++封装SQlite<二>
- C++封装SQlite<三>
- Vs + Qt 各种路径设置
- 二叉树中和为某一值的路径(java版)
- Gradle基础
- ListView缓存优化机制
- lua 协程 | 协程实现消息机制(事件队列轮询处理机制)
- sqlite简单封装
- nginx会去掉带有下划线的Header键值
- samba映射linux驱动器
- Struts2拦截器登录验证
- Android探索之旅(第十七篇)Android中使用webSocket保持长连接通信
- mysql-mac下载安装及修改初始密码
- Gym
- json数据转换为xml格式
- 解决PDO中文乱码