Android关于SqList数据库的使用和封装
2017-10-27 10:52
225 查看
对于开发者来说肯定都对于数据库不会陌生,今天就来分享一篇关于android的数据库的一些操作和简单封装 ,好,废话不多说,直接上代码(大部分解释都注释在代码中了)
MySQLiteOpenHelper.javapublic class MySQLiteOpenHelper extends SQLiteOpenHelper { private static MySQLiteOpenHelper helper; public static final String DB_NAME = "Topeasy.db";// 数据库名称 public static final int VERSION = 1; /** * 支持创建持数据表时判断是否存在,存在则不创建,不存在则创建,相应语句如下: * create table if not exists * MySQL官方对CREATE TABLE IF NOT EXISTS SELECT给出的解释是: * CREATE TABLE IF NOT EXIST… SELECT的行为,先判断表是否存在, * 如果存在,语句就相当于执行insert into select; * 如果不存在,则相当于create table … select。 * 解析: 1)integer 表示整型, 2)real 表示浮点型, 3)text 表示文本类型, 4)blob * 表示二进制类型。 * 为了确保数据的完整性和一致性,在创建表时指定字段名称,字段类型和字段属性外,还需要使用约束(constraint), * 索引 (index),主键(primary key)和外键(foregin key)等。 * 约束条件: * not null 非空约束 * unique 唯一性约束 * primary key 主键约束 * foreign key 外键约束 * check 检查约束 * auto_increment 自动标识列(值会自动增1) */ public static final String CREATE_CUSTOMER = "create table " + TableConfig.TABLE_CUSTOMER + " (" + "id integer not null primary key autoincrement," + TableConfig.Customer.CUSTOMER_NAME + " verchar(20)," + TableConfig.Customer.DELIVERY_PHONE + " verchar(20)," + TableConfig.Customer.ADDR + " verchar(20) ," + TableConfig.Customer.ACCESS_TYPE + " verchar(20)," + TableConfig.Customer.CUSTOMER_RATING + " verchar(20), " + TableConfig.Customer.LAYERS + " verchar(20)," + TableConfig.Customer.CONTACTS + " verchar(20)," + TableConfig.Customer.REMARK + " verchar(20))"; //构造器,传入四个参数Context对象,数据库名字name,操作数据库的Cursor对象,版本号version。 private MySQLiteOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { super(context, name, factory, version); } //为了简化构造器的使用,我们自定义一个构造器 private MySQLiteOpenHelper(Context context, String name) { this(context, name, null, VERSION);//传入Context和数据库的名称,调用上面那个构造器 } //将自定义的数据库创建类单例。 synchronize单例 防止多线程同时那啥 双重锁定 public static MySQLiteOpenHelper getInstance(Context context) { if (helper == null) { synchronized (MySQLiteOpenHelper.class) { if (helper == null) helper = new MySQLiteOpenHelper(context, DB_NAME);//数据库名称为create_db。 } } return helper; } @Override public void onCreate(SQLiteDatabase db) { //在创建数据库时,初始化创建数据库中包含的数据库表。这里以一个“客户”的数据表为例 /* customer 创建 "客户"数据表 */ db.execSQL(CREATE_CUSTOMER);// 执行sql语句 } /** * 对数据库进行升级,注意: switch 中每一个 case的最后都是没有使用 break , * 这是为了保证在跨版本升级的时候,每一次的数据库修改都能被全部执行到 * //当打开数据库时传入的版本号与当前的版本号不同时会调用该方法。 */ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { //switch (oldVersion) { // case 1: // db.execSQL(CREATE_CUSTOMER); // APP.mToast("更新数据库,旧版本是" + oldVersion); // case 2: // db.execSQL(CREATE_CUSTOMER); // APP.mToast("更新数据库,旧版本是" + oldVersion); // default: // } db.execSQL("drop table if exists "+TableConfig.TABLE_CUSTOMER); // 如果存在表Book,则删除该表 onCreate(db); // 重新调用onCreate(),创建表 }
代码中注释已经解释的好清楚了,就不多bb了好吧
DbManager.java
import android.database.sqlite.SQLiteDatabase; import com.my_movingbricks.app.APP; /** * TP0826 创建数据库类 * Created by 搬砖小能手 on 2017/4/6. * E-mail:40492459@qq.com. * Signature:当你的才华满足不了你的野心的时候,那么你应该静下心来学习. * Alert:语言的巨人,行动的矮子! */ public class DbManager { private static DbManager manager; private MySQLiteOpenHelper mySQLiteOpenHelper; private SQLiteDatabase db; /** * 私有化构造器 * */ private DbManager() { //创建数据库 mySQLiteOpenHelper = MySQLiteOpenHelper.getInstance(APP.getInstance()); if (db == null) { db = mySQLiteOpenHelper.getWritableDatabase(); } } /** * 单例DbManager类 * * @return 返回DbManager对象 */ public static DbManager newInstances() { if (manager == null) { synchronized (DbManager.class) { if (manager == null) { manager = new DbManager(); } } } return manager; } /** * 获取数据库的对象 * * @return 返回SQLiteDatabase数据库的对象 */ public SQLiteDatabase getDataBase() { return db; } /** * 关闭数据库 */ public void close() { mySQLiteOpenHelper.close(); mySQLiteOpenHelper = null; db.close(); db = null; manager = null; } }
初始化数据库,关闭等等。。
ChannelDaoInface.java
import java.util.ArrayList; public interface ChannelDaoInface<T> { /** * 插入一条数据 * * @param item 传进来的item * @return 是否插入成功 */ public boolean addCache(String tableName, T item); /** * 删除一条数据 * * @param tableName 删除数据库的表名 * @param whereClause "url=?"; 删除的字段名 * @param whereArgs {name} 删除的字段的值 * @return */ public boolean deleteCache(String tableName, String whereClause, String whereArgs); /** * 更新 * * @param tableName 更改数据的数据表 * @param columnName "url=?" 更改的数据的字段名 * @param columnValue {name}; 更改的数据的字段值 * @param object 更改的数据 * @return */ public boolean updateCache(String tableName, String columnName, String columnValue, Object object); /** * * @param tableName 查询的数据库的名字 * @param entityType 查询的数据库所对应的module * @param fieldName 查询的字段名 * @param value 查询的字段值 * @return */ public <T> ArrayList<T> queryCache(String tableName, Class<T> entityType, String fieldName, String value); public void clearFeedTable(); }
一些数据库操作
ChannelDao.java
import android.content.ContentValues; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import com.my_movingbricks.dbinit.db.DbManager; import com.my_movingbricks.dbinit.db.MySQLiteOpenHelper; import com.my_movingbricks.dbinit.dbinterface.ChannelDaoInface; import java.lang.reflect.Field; import java.util.ArrayList; /** * TP0826 操作数据库的封装类 * Created by 搬砖小能手 on 2017/4/6. * E-mail:40492459@qq.com. * Signature:当你的才华满足不了你的野心的时候,那么你应该静下心来学习. * Alert:语言的巨人,行动的矮子! */ public class ChannelDao<T> implements Channe e69b lDaoInface<T> { private DbManager manager; private SQLiteDatabase db; public ChannelDao() { //创建数据库 manager = DbManager.newInstances(); db = manager.getDataBase(); } /** * 向数据库插入数据 * * @param tableName 数据库插入数据的数据表 * @param item 数据库插入的对象 */ @Override public boolean addCache(String tableName, T item) { boolean flag = false; long id = 0; Class clazz = item.getClass(); Field[] fields = clazz.getDeclaredFields();//获取该类所有的属性 ContentValues value = new ContentValues(); for (Field field : fields) { try { field.setAccessible(true); //取消对age属性的修饰符的检查访问,以便为属性赋值 String content = (String) field.get(item);//获取该属性的内容 value.put(field.getName(), content); field.setAccessible(false);//恢复对age属性的修饰符的检查访问 } catch (IllegalAccessException e) { e.printStackTrace(); } } id = db.insert(tableName, null, value); flag = (id != -1 ? true : false); return flag; } /** * 删除数据 * * @param tableName 删除数据库的表名 * @param whereClause 删除的字段名 * @param whereArgs 删除的字段的值 */ @Override public boolean deleteCache(String tableName, String whereClause, String whereArgs) { boolean flag = false; int count = 0; count =db.delete(tableName, whereClause + "=?", new String[]{whereArgs}); flag = (count > 0 ? true : false); return flag; } /** * 更改数据库内容 * * @param tableName 更改数据的数据表 * @param columnName 更改的数据的字段名 * @param columnValue 更改的数据的字段值 * @param object 更改的数据 */ @Override public boolean updateCache(String tableName, String columnName, String columnValue, Object object) { boolean flag = false; int count = 0; try { Class clazz = object.getClass(); Field[] fields = clazz.getDeclaredFields();//获取该类所有的属性 ContentValues value = new ContentValues(); for (Field field : fields) { field.setAccessible(true); //取消对age属性的修饰符的检查访问,以便为属性赋值 String content = (String) field.get(object);//获取该属性的内容 value.put(field.getName(), content); field.setAccessible(false);//恢复对age属性的修饰符的检查访问 } count=db.update(tableName, value, columnName + "=?", new String[]{columnValue}); flag = (count > 0 ? true : false); } catch (IllegalAccessException e1) { e1.printStackTrace(); } return flag; } /** * * @param tableName 查询的数据库的名字 * @param entityType 查询的数据库所对应的module * @param fieldName 查询的字段名 * @param value 查询的字段值 * @param <T> 泛型代表AttendInformation,Customer,Order,User,WorkDaily类 * @return 返回查询结果,结果为AttendInformation,Customer,Order,User,WorkDaily对象 */ @Override public <T> ArrayList<T> queryCache(String tableName, Class<T> entityType, String fieldName, String value) { ArrayList<T> list = new ArrayList(); Cursor cursor = db.query(tableName, null, fieldName + " like ?", new String[]{value}, null, null, " id desc", null); cursor.moveToFirst(); while (!cursor.isAfterLast()) {//返回游标是否指向第最后一行的位置 try { T t = entityType.newInstance(); for (int i = 0; i < cursor.getColumnCount(); i++) { String columnName = cursor.getColumnName(i);// 获取数据记录第i条字段名的 String content = cursor.getString(i);//获得获取的数据记录第i条字段的内容 Field field = entityType.getDeclaredField(columnName);//获取该字段名的Field对象。 field.setAccessible(true);//取消对age属性的修饰符的检查访问,以便为属性赋值 field.set(t, content); field.setAccessible(false);//恢复对age属性的修饰符的检查访问 } list.add(t); cursor.moveToNext(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } catch (NoSuchFieldException e) { e.printStackTrace(); } } return list; } /** * 删除表中的数据 */ @Override public void clearFeedTable() { String sql = "DELETE FROM " + MySQLiteOpenHelper.CREATE_CUSTOMER + ";"; db.execSQL(sql); revertSeq(); } /** * 以SQLHelper.TABLE_CHANNEL表作为条件,新建表sqlite_sequence,当name=表名的时候 * 更新seq=0; */ private void revertSeq() { String sql = "update sqlite_sequence set seq=0 where name='" + MySQLiteOpenHelper.CREATE_CUSTOMER + "'"; db.execSQL(sql); } //关闭数据库 private void OnCliar(ContentValues value) { value.clear(); } }
操作的实现
TableOperate.java
import android.content.ContentValues; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import com.my_movingbricks.dbinit.db.DbManager; /** * abc * Created by 搬砖小能手 on 27/10/2017. * E-mail:40492459@qq.com. * Signature:当你的才华满足不了你的野心的时候,那么你应该静下心来学习. * Alert:语言的巨人,行动的矮子! */ public class TableOperate { private DbManager manager; private SQLiteDatabase db; public TableOperate() { //创建数据库 manager = DbManager.newInstances(); db = manager.getDataBase(); } /** * 添加数据 */ public void insertData(String tableName, ContentValues values) { db.insert(tableName, null, values);// 插入一条数据 } public ContentValues initContentValues(String[] key, String[] values) { if (key.length != values.length) return null; ContentValues cv = new ContentValues(); for (int i = 0; i < key.length; i++) { cv.put(key[i], values[i]); } return cv; } public void insertData(String tableName, String[] key, String[] values) { db.insert(tableName, null, initContentValues(key, values));// 插入一条数据 } /** * 更新数据 * * @param values * @param whereClause "url=?" * @param whereArgs {name}; */ public void updateData(String tableName, ContentValues values, String whereClause, String[] whereArgs) { db.update(tableName, values, whereClause, whereArgs); } public void updateData(String tableName, String[] key, String[] values, String whereClause, String[] whereArgs) { db.update(tableName, initContentValues(key, values), whereClause, whereArgs); } /** * 删除数据 * * @param whereClause "url=?" * @param whereArgs {name}; */ public void deleteData(String tableName, String whereClause, String[] whereArgs) { db.delete(tableName, whereClause, whereArgs); } /** * 查询数据 * * @param tableName 表名,不能为null * @param columns 要查询的列名,可以是多个,可以为null,表示查询所有列 * @param selection 查询条件,比如id=? and name=? 可以为null * @param selectionArgs 对查询条件赋值,一个问号对应一个值,按顺序 可以为null * @param groupBy * @param having 语法have,可以为null * @param orderBy 语法,按xx排序,可以为null * @return */ public Cursor selectData(String tableName, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy) { Cursor cursor = db.query(tableName, columns, selection, selectionArgs, groupBy, having, orderBy); return cursor; } public void selectData(Cursor cursor, String... key) { if (cursor.moveToFirst()) { // 返回假时 那就为空 移动光标到第一行 do { for (int i = 0; i < key.length; i++) { String name=cursor.getString(cursor.getColumnIndex(key[i])); } } while (cursor.moveToNext()); } cursor.close(); } /** if (cursor.moveToFirst()) {// 返回假时 那就为空 移动光标到第一行 do { // 遍历cursor对象,取出数据 对比搜索到的数据,如果有则为已收藏收藏 String url = cursor.getString(cursor.getColumnIndex("url")); String theme = cursor.getString(cursor.getColumnIndex("theme")); String content = cursor.getString(cursor .getColumnIndex("content")); } } while (cursor.moveToNext()); */ }
另一个实现类,以便满足多种需求
好了 就这么愉快的分享完了,总体来说比较简单,当然大家可以去使用目前比较成熟的框架greenDAO或者是xutlis的db模块,也是比较通俗易懂的,这里就不做介绍了哈, 如果文章有错误希望小伙伴们告知一下哈 。
文章末尾附上设计的几个类的下载地址:点击传送
![](https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1509082730780&di=41614325038f0244d4f495a38c081b77&imgtype=0&src=http://d.hiphotos.baidu.com/image/pic/item/d62a6059252dd42a435fea6b0a3b5bb5c8eab898.jpg)
相关文章推荐
- Android数据库框架GreenDao封装使用,易理解、易扩展
- 关于Android数据库开发中LitePal的配置和使用
- android关于数据库SQLite的简单使用
- Android sqlite数据库的封装使用
- Android数据库二:使用谷歌封装好的api对数据库增删改查
- Android开源:数据库ORM框架GreenDao封装工具类使用
- Android开源:数据库ORM框架GreenDao学习(三)封装工具类使用
- 关于android-async-http的使用,封装网络请求
- Android 关于 如何使用外界导入的数据库文件
- 关于Android sqlite3数据库创建使用内容提供者contentProvider及解析者ContentResolver,观察者ContentResolver案例
- Android 关于 如何使用外界导入的数据库文件
- 关于Android 数据库使用的几点心得
- Android使用ORM思想封装数据库
- 关于Android的轻量级数据库SQLlite的使用实践小项目 (生管理系统(附源码))
- 关于Android数据库—realm的使用及理解
- 关于android sqlite数据库使用的几点心得
- 关于Android中使用Uri监听数据库的变化
- 关于如何使用ADO连接数据库
- jdbc数据库连接管理封装工具类,不同使用属性文件配置数据库连接信息(1)
- 关于数据库缓存依赖项的使用