数据库封装之app离线缓存
来源:互联网 发布:apache 下载php文件 编辑:程序博客网 时间:2024/05/22 00:45
数据库封装 这个网上有很多,这里就借用一下学习(非常感谢)
public class SQLiteManager { // SQLite public SQLiteDatabase db;//数据库操作对象 private Context context; //上下文 private DBOpenHelper dbOpenHelper;//建表所需的帮助类 private class DBOpenHelper extends SQLiteOpenHelper { public DBOpenHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) { super(context, name, factory, version); } @Override public void onCreate(SQLiteDatabase _db) { int size = tables.size();//获取当前需要建表的数量 for (int i = 0; i < size; i++)//拼接建表SQL语句 { String sql = getTableCreateSQLString(tables.get(i)); _db.execSQL(sql);//执行建库建表语句 } } @Override public void onUpgrade(SQLiteDatabase _db, int _oldVersion, int _newVersion) { int size = tables.size();//同创建表机制,拼接跟新表SQL语句 for (int i = 0; i < size; i++) { _db.execSQL("DROP TABLE IF EXISTS " + getTableCreateSQLString(tables.get(i))); } onCreate(_db); } } // DB_name private String DB_NAME; // DB_version private int DB_VERSION = 1; //ArrayList <Table> private ArrayList<Table> tables = new ArrayList<>();//该库中表对象列表 //constrat public SQLiteManager() { } //init 初始化建库工作,传入库名 public void init(Context context, String DB_name) { tables.clear(); this.context = context; this.DB_NAME = DB_name; } private static SQLiteManager instance = null; public static SQLiteManager getInstance()//单例模式 方便外部调用 { if (instance == null) { synchronized (SQLiteManager.class) { if (instance == null) { instance = new SQLiteManager(); } } } return instance; } //open 做数据库操作之前都要调用open方法 public void open() { dbOpenHelper = new DBOpenHelper(context, DB_NAME, null, DB_VERSION); try { db = dbOpenHelper.getWritableDatabase(); } catch (SQLiteException ex) { ex.printStackTrace(); exceptionHandler(); } db.beginTransaction(); } /** * 数据库文件损坏删除异常处理 */ private void exceptionHandler() { if (db == null) { return; } File file = new File(db.getPath()); if (!file.exists()) { try { if (file.createNewFile()) { open(); } } catch (IOException e) { e.printStackTrace(); } } } //close 长时间不适用数据库可执行close方法关闭数据库 public void close() { db.setTransactionSuccessful(); db.endTransaction(); if (db != null) { db.close(); db = null; } } //create table 注册表 外界任何想在该库下创建的表都必须注册 注册后tables列表会增加,这回作用到建表时SQL语句的生成 public void registerTable(String table_name, ArrayList<Item> items) { Table table = new Table(table_name, "_id", items); tables.add(table); } //两种不同的注册方式 建议使用第二种方式进行注册,因为第二种方式的表对象是外界传入的,外界可以利用该对象进行更多的操作。详情见下 public void registerTable(Table table) { tables.add(table); } // get table create sql by items 建表语句拼接代码 遍历tables列表,由于每个表又可以有多个字段,故字段类型不同又有对应的语句区别。 private static String getTableCreateSQLString(Table table) { String sql = "create table " + table.table_name;//表名 下面依次是“主键”+“item1”+“item2”+.....+"item n" 拼接代码原理不熟的百度能搜出一大把,这里只是稍微换了一种形式的写法。 sql += "(" + table.keyItem + " integer primary key autoincrement"; int size = table.items.size(); for (int i = 0; i < size; i++) { sql += ","; if (table.items.get(i).type.equals(Item.item_type_integer)) { sql += table.items.get(i).text + " integer not null"; } else if (table.items.get(i).type.equals(Item.item_type_text)) { sql += table.items.get(i).text + " text not null"; } else if (table.items.get(i).type.equals(Item.item_type_boolen)) { sql += table.items.get(i).text + " bool not null"; } else if (table.items.get(i).type.equals(Item.item_type_long)) { sql += table.items.get(i).text + " long not null"; } // TODO: 16-8-23 add other data type 可能有别的数据属性 要看SQLite还支持那些数据的存储 } sql += ");"; Log.i("coyc", "getTableCreateSQLString" + sql); return sql; } //如果是使用第一种方式注册的 这里提供一个接口获取本类中tables列表中的某个表,传入所需要获取的表名即可(不是重点) public Table getTableByName(String tableName) { int size = tables.size(); if (size == 0) { return null; } else { for (int i = 0; i < size; i++) { if (tableName.equalsIgnoreCase(tables.get(i).table_name)) { return tables.get(i); } } } return null; }}
/** * Created by changquan on 2017/9/15. * 基表:所有的表都要继承此类 */public class Table { public String table_name; //table strings 表属性列表 public ArrayList<Item> items = new ArrayList<>(); //key 自定主键项 一般默认为“_id” public String keyItem; //db public Table() { } public Table(String table_name,String keyItem) { this.keyItem = keyItem; this.table_name = table_name; } public Table(String table_name,String keyItem,ArrayList<Item> items) { this.keyItem = keyItem; this.table_name = table_name; this.items = items; }}
/** * Created by changquan on 2017/9/15. * 具体表的参数 */public class Item { public static final String item_type_integer = "item_type_integer"; public static final String item_type_text = "item_type_text"; public static final String item_type_long = "item_type_long"; public static final String item_type_boolen = "item_type_boolen"; public String text = ""; public String type = ""; public Item(String text,String type) { this.text = text; this.type = type; } public Item() { }}
上面就是数据库的一个封装,下面就学习使用该封装来实现一下简单的app离线缓存
/** * Created by changquan on 2017/9/15. * app离线缓存表 */public class UnLineCacheTable extends Table{ public static final String URL = "url"; public static final String DATA = "json"; public static final String TIME = "time"; public UnLineCacheTable() { init(); } public void init() { table_name = "unlinecache"; keyItem = "_id";//默认给予主键为“_id” //构建属性 items.add(new Item(URL, Item.item_type_text)); items.add(new Item(DATA, Item.item_type_text)); items.add(new Item(TIME, Item.item_type_text)); } public long insert(ContentValues cv) { return SQLiteManager.getInstance().db.insert(table_name, null, cv); } public long deleteAllItem() { return SQLiteManager.getInstance().db.delete(table_name, null, null); } public long deleteOneByItem(String item, String content) { String[] args = {String.valueOf(content)}; return SQLiteManager.getInstance().db.delete(table_name, item + " =?", args); } public long updateOneByItem(String item, String content, ContentValues contentData) { String[] args = {String.valueOf(content)}; return SQLiteManager.getInstance().db.update(table_name, contentData, item + " =? ", args); } public String queryData(){ Cursor query = SQLiteManager.getInstance().db.query(table_name, new String[]{"url"}, "url=?", new String[]{"http//....."}, null, null, null); if (query.moveToNext()) { String date = query.getString(query.getColumnIndex("date")); return date; } return ""; } // 对参数进行赋值处理 public ContentValues getContentValues() { ContentValues contentValues = new ContentValues(); contentValues.put("url", "...."); contentValues.put("json", "...."); contentValues.put("time", "...."); return contentValues; }}
用来学习还是很好的
阅读全文
0 0
- 数据库封装之app离线缓存
- iOS数据库离线缓存思路和网络层封装
- iOS 数据库离线缓存思路和网络层封装
- iOS数据库离线缓存思路和网络层封装
- iOS 数据库离线缓存思路和网络层封装
- iOS数据库离线缓存思路和网络层封装
- iOS数据库离线缓存思路和网络层封装——数据缓存操作封装
- iOS数据库离线缓存思路和网络层封装——数据缓存机制Model封装
- iOS数据库离线缓存思路和网络层封装——网络请求基类封装
- Hybird-App离线缓存系统
- iOS数据库离线缓存思路和网络层封装——原理
- web APP离线缓存实现方式
- HTML5之离线应用缓存
- HTML5之离线应用缓存
- XZ_iOS之实现离线缓存
- hybird架构之离线缓存
- Android离线之文件缓存
- Android 离线缓存之文件缓存
- STM32—无需中断来实现使用DMA接收串口数据(原创)
- (转载)Linux 学习记录 一(安装、基本文件操作)
- rocket mq 的广播模式示例
- windows 下搭建邮件服务器
- Oracle数据库数据导出
- 数据库封装之app离线缓存
- (主题模型的应用)应用LDA抽取评论的主题特征
- em算法的一些理解
- 2017年亚洲展备受瞩目的 Garmin智能手环
- .Net平台 C# 程序, 使用DILE(Dotnet IL Editor) 进行动态调试
- C#运行外部程序并后台等待...
- JEESZ-Zookeeper集群安装
- 设计模式之——命令设计模式
- webstorm terminal终端后,有时候会出现折行现象