【Android】通用系列 —— 数据持久化(通用的SQLite封装)
2016-07-13 22:04
519 查看
关键字
SQL
SQLite
通用系列
数据存储
摘要:
主要内容:本文介绍了封装后的SQLite,以便快速开发;
只保留必要的定制,重复的代码封装到一个通用类中;
说明
LouSQLite.java文件为通用的代码,所有项目中不需要修改即可使用;
MyCallBack.java文件是自定义的文件,关于项目的数据库配置都在这里进行,例如:数据库名称、数据库版本号、table语句等;
LouSQLite.java支持常用的CRUD操作(支持事务);
代码
【用法】
使用方法
lists = Arrays.asList( new Phrase("窈窕淑女,君子好逑"), new Phrase("海上生明月,天涯共此时"), new Phrase("青青子衿,悠悠我心"), new Phrase("人生若只如初见") ); LouSQLite.insert(MyCallBack.TABLE_PHRASE, lists); // 更新到数据库 LouSQLite.update(MyCallBack.TABLE_PHRASE, phrase, MyCallBack.KEY_PHRASE_ID + "=?", new String[]{phrase.getId()}); // 查找 List lists = LouSQLite.query(MyCallBack.TABLE_PHRASE, "select * from " + MyCallBack.TABLE_PHRASE, null); // 从数据库中删除 LouSQLite.delete(MyCallBack.TABLE_PHRASE, MyCallBack.KEY_PHRASE_ID + "=?", new String[]{phrase.getId()});" data-snippet-id="ext.276d89f67b30182ceedfa7eb4506bd05" data-snippet-saved="false" data-codota-status="done">[code]// 初始化 LouSQLite.init(mContext, MyCallBack.getInstance()); Phrase phrase = new Phrase("青青子衿,悠悠我心"); // 插入一个数据到数据库 LouSQLite.insert(MyCallBack.TABLE_PHRASE, phrase); // 插入一组数据 List<Phrase> lists = Arrays.asList( new Phrase("窈窕淑女,君子好逑"), new Phrase("海上生明月,天涯共此时"), new Phrase("青青子衿,悠悠我心"), new Phrase("人生若只如初见") ); LouSQLite.insert(MyCallBack.TABLE_PHRASE, lists); // 更新到数据库 LouSQLite.update(MyCallBack.TABLE_PHRASE, phrase, MyCallBack.KEY_PHRASE_ID + "=?", new String[]{phrase.getId()}); // 查找 List<Phrase> lists = LouSQLite.query(MyCallBack.TABLE_PHRASE, "select * from " + MyCallBack.TABLE_PHRASE, null); // 从数据库中删除 LouSQLite.delete(MyCallBack.TABLE_PHRASE, MyCallBack.KEY_PHRASE_ID + "=?", new String[]{phrase.getId()});
【数据库定制】
createTablesSQL() { return Arrays.asList( TABLE_PHRASE_SQL, TABLE_FAVORITE_SQL ); } @Override public String getName() { return DB_NAME; } @Override public int getVersion() { return DB_VERSION; } @Override public void doUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { switch (oldVersion) { case 0: db.execSQL(TABLE_FAVORITE_SQL); // 升级操作; case 1: break; default: break; } } @Override public void assignValuesByInstance(String tableName, T t, ContentValues values) { switch (tableName) { case TABLE_PHRASE: if (t instanceof Phrase) { Phrase phrase = (Phrase) t; values.put(KEY_PHRASE_ID, phrase.getId()); values.put(KEY_PHRASE_CONTENT, phrase.getContent()); values.put(KEY_PHRASE_FAVORITE, phrase.getFavorite()); } break; case TABLE_FAVORITE: if (t instanceof Phrase) { Phrase phrase = (Phrase) t; values.put(KEY_FAVORITE_ID, phrase.getId()); values.put(KEY_FAVORITE_CONTENT, phrase.getContent()); values.put(KEY_FAVORITE_FAVORITE, phrase.getFavorite()); } break; } } @Override public Object newInstanceByCursor(String tableName, Cursor cursor) { switch (tableName) { case TABLE_PHRASE: return new Phrase( cursor.getString(cursor.getColumnIndex(KEY_PHRASE_ID)), cursor.getString(cursor.getColumnIndex(KEY_PHRASE_CONTENT)), cursor.getInt(cursor.getColumnIndex(KEY_PHRASE_FAVORITE)) ); case TABLE_FAVORITE: return new Phrase( cursor.getString(cursor.getColumnIndex(KEY_FAVORITE_ID)), cursor.getString(cursor.getColumnIndex(KEY_FAVORITE_CONTENT)), cursor.getInt(cursor.getColumnIndex(KEY_FAVORITE_FAVORITE)) ); } return null; } } " data-snippet-id="ext.2f8e0087efc4bc22327aa5b639d59242" data-snippet-saved="false" data-codota-status="done">[code]//: MyCallBack.java package com.lyloou.lou.db; import android.content.ContentValues; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import com.lyloou.lou.bean.Phrase; import java.util.Arrays; import java.util.List; /** * 类描述: * 创建人: Lou * 创建时间: 2016/7/13 14:22 * 修改人: Lou * 修改时间:2016/7/13 14:22 * 修改备注: */ public class MyCallBack implements LouSQLite.ICallBack { private static final String TAG = "MyCallBack"; private MyCallBack() { } private static LouSQLite.ICallBack INSTANCE; public static LouSQLite.ICallBack getInstance() { if (INSTANCE == null) { INSTANCE = new MyCallBack(); } return INSTANCE; } /////////////////////////////////////////////////////////////////////////// // db config /////////////////////////////////////////////////////////////////////////// public static final String DB_NAME = "DBNAME.db"; public static final int DB_VERSION = 1; /////////////////////////////////////////////////////////////////////////// // table phrase /////////////////////////////////////////////////////////////////////////// public static final String TABLE_PHRASE = "phrase"; public static final String KEY_PHRASE_ID = "PHRASE_ID"; private static final String KEY_PHRASE_CONTENT = "PHRASE_CONTENT"; private static final String KEY_PHRASE_FAVORITE = "PHRASE_FAVORITE"; private static final String TABLE_PHRASE_SQL = "create table " + TABLE_PHRASE + " (" + "id integer primary key autoincrement, " + KEY_PHRASE_ID + " text, " + KEY_PHRASE_CONTENT + " text, " + KEY_PHRASE_FAVORITE + " integer" + ")"; /////////////////////////////////////////////////////////////////////////// // table favorite /////////////////////////////////////////////////////////////////////////// public static final String TABLE_FAVORITE = "favorite"; public static final String KEY_FAVORITE_ID = "FAVORITE_ID"; private static final String KEY_FAVORITE_CONTENT = "FAVORITE_CONTENT"; private static final String KEY_FAVORITE_FAVORITE = "FAVORITE_FAVORITE"; private static final String TABLE_FAVORITE_SQL = "create table " + TABLE_FAVORITE + " (" + "id integer primary key autoincrement, " + KEY_FAVORITE_ID + " text, " + KEY_FAVORITE_CONTENT + " text," + KEY_FAVORITE_FAVORITE + " integer" + ")"; /////////////////////////////////////////////////////////////////////////// // overrite /////////////////////////////////////////////////////////////////////////// @Override public List<String> createTablesSQL() { return Arrays.asList( TABLE_PHRASE_SQL, TABLE_FAVORITE_SQL ); } @Override public String getName() { return DB_NAME; } @Override public int getVersion() { return DB_VERSION; } @Override public void doUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { switch (oldVersion) { case 0: db.execSQL(TABLE_FAVORITE_SQL); // 升级操作; case 1: break; default: break; } } @Override public <T> void assignValuesByInstance(String tableName, T t, ContentValues values) { switch (tableName) { case TABLE_PHRASE: if (t instanceof Phrase) { Phrase phrase = (Phrase) t; values.put(KEY_PHRASE_ID, phrase.getId()); values.put(KEY_PHRASE_CONTENT, phrase.getContent()); values.put(KEY_PHRASE_FAVORITE, phrase.getFavorite()); } break; case TABLE_FAVORITE: if (t instanceof Phrase) { Phrase phrase = (Phrase) t; values.put(KEY_FAVORITE_ID, phrase.getId()); values.put(KEY_FAVORITE_CONTENT, phrase.getContent()); values.put(KEY_FAVORITE_FAVORITE, phrase.getFavorite()); } break; } } @Override public Object newInstanceByCursor(String tableName, Cursor cursor) { switch (tableName) { case TABLE_PHRASE: return new Phrase( cursor.getString(cursor.getColumnIndex(KEY_PHRASE_ID)), cursor.getString(cursor.getColumnIndex(KEY_PHRASE_CONTENT)), cursor.getInt(cursor.getColumnIndex(KEY_PHRASE_FAVORITE)) ); case TABLE_FAVORITE: return new Phrase( cursor.getString(cursor.getColumnIndex(KEY_FAVORITE_ID)), cursor.getString(cursor.getColumnIndex(KEY_FAVORITE_CONTENT)), cursor.getInt(cursor.getColumnIndex(KEY_FAVORITE_FAVORITE)) ); } return null; } }
//: Pharse.java package com.lyloou.lou.bean; import java.util.UUID; /** * 类描述: * 创建人: Lou * 创建时间: 2016/7/12 9:49 * 修改人: Lou * 修改时间:2016/7/12 9:49 * 修改备注: */ public class Phrase { private String mId; private String mContent; private int mFavorite; // 0表示未收藏,1表示已收藏; public Phrase(String content) { this(UUID.randomUUID().toString(), content, 0); } public Phrase(String content, int favorite) { this(UUID.randomUUID().toString(), content, favorite); } public Phrase(String id, String content, int favorite) { mId = id; mContent = content; mFavorite = favorite; } public String getId() { return mId; } public void setId(String id) { mId = id; } public String getContent() { return mContent; } public void setContent(String content) { mContent = content; } public int getFavorite() { return mFavorite; } public void setFavorite(int favorite) { mFavorite = favorite; } }
【通用源码】
createTablesSQL(); void assignValuesByInstance(String tableName, T t, ContentValues values); T newInstanceByCursor(String tableName, Cursor cursor); } private static final String ILLEGAL_OPREATION = "非法操作,请先进行初始化操作:LouSQLite.init()"; private static LouSQLite INSTANCE; public static void init(Context context, ICallBack callBack) { if (INSTANCE == null) { INSTANCE = new LouSQLite(context, callBack); } } public static void insert(String tableName, T t) { if (INSTANCE == null) { throw new IllegalStateException(ILLEGAL_OPREATION); } SQLiteDatabase db = INSTANCE.getWritableDatabase(); db.beginTransaction(); try { ContentValues values = new ContentValues(); INSTANCE.mCallBack.assignValuesByInstance(tableName, t, values); db.insert(tableName, null, values); values.clear(); db.setTransactionSuccessful(); } finally { db.endTransaction(); db.close(); } } public static void insert(String tableName, List ts) { if (INSTANCE == null) { throw new IllegalStateException(ILLEGAL_OPREATION); } SQLiteDatabase db = INSTANCE.getWritableDatabase(); db.beginTransaction(); try { ContentValues values = new ContentValues(); for (T t : ts) { INSTANCE.mCallBack.assignValuesByInstance(tableName, t, values); db.insert(tableName, null, values); values.clear(); } db.setTransactionSuccessful(); } finally { db.endTransaction(); db.close(); } } public static void update(String tableName, T t, String whereClause, String[] whereArgs) { if (INSTANCE == null) { throw new IllegalStateException(ILLEGAL_OPREATION); } SQLiteDatabase db = INSTANCE.getWritableDatabase(); db.beginTransaction(); try { ContentValues values = new ContentValues(); INSTANCE.mCallBack.assignValuesByInstance(tableName, t, values); db.update(tableName, values, whereClause, whereArgs); values.clear(); db.setTransactionSuccessful(); } finally { db.endTransaction(); db.close(); } } public static void update(String tableName, List ts, String whereClause, String[] whereArgs) { if (INSTANCE == null) { throw new IllegalStateException(ILLEGAL_OPREATION); } SQLiteDatabase db = INSTANCE.getWritableDatabase(); db.beginTransaction(); try { ContentValues values = new ContentValues(); for (T t : ts) { INSTANCE.mCallBack.assignValuesByInstance(tableName, t, values); db.update(tableName, values, whereClause, whereArgs); values.clear(); } db.setTransactionSuccessful(); } finally { db.endTransaction(); db.close(); } } public static void delete(String tableName, String whereClause, String[] whereArgs) { if (INSTANCE == null) { throw new IllegalStateException(ILLEGAL_OPREATION); } SQLiteDatabase db = INSTANCE.getWritableDatabase(); db.beginTransaction(); try { db.delete(tableName, whereClause, whereArgs); db.setTransactionSuccessful(); } finally { db.endTransaction(); db.close(); } } public static List query(String tableName, @NonNull String queryStr, @Nullable String[] whereArgs) { if (INSTANCE == null) { throw new IllegalStateException(ILLEGAL_OPREATION); } List lists = new ArrayList<>(); SQLiteDatabase db = INSTANCE.getReadableDatabase(); db.beginTransaction(); try { db.setTransactionSuccessful(); Cursor cursor = db.rawQuery(queryStr, whereArgs); if (cursor.moveToFirst()) { do { T tt = INSTANCE.mCallBack.newInstanceByCursor(tableName, cursor); if (tt != null) { lists.add(tt); } } while (cursor.moveToNext()); } cursor.close(); } finally { db.endTransaction(); db.close(); } return lists; } /////////////////////////////////////////////////////////////////////////// // Self /////////////////////////////////////////////////////////////////////////// private final ICallBack mCallBack; private static final String TAG = "LouSQLite"; private LouSQLite(@NonNull Context context, @NonNull ICallBack callBack) { super(context, callBack.getName(), null, callBack.getVersion()); mCallBack = callBack; } @Override public void onCreate(SQLiteDatabase db) { for (String create_table : mCallBack.createTablesSQL()) { db.execSQL(create_table); Log.d(TAG, "create table " + "[ \n" + create_table + "\n ]" + " successful! "); } } @Override public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) { mCallBack.doUpgrade(sqLiteDatabase, oldVersion, newVersion); } } " data-snippet-id="ext.11a8b43c3fe96cada084d84e93618e2f" data-snippet-saved="false" data-codota-status="done">[code]//: LouSQLite.java package com.lyloou.lou.db; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.util.Log; import java.util.ArrayList; import java.util.List; /** * 类描述:一个通用的SQLite,通过简单的配置快速搭建一个数据库存储方案; * 创建人: Lou * 创建时间: 2016/7/13 10:10 * 修改人: Lou * 修改时间:2016/7/13 10:10 * 修改备注: */ public class LouSQLite extends SQLiteOpenHelper { public interface ICallBack { String getName(); int getVersion(); void doUpgrade(SQLiteDatabase db, int oldVersion, int newVersion); List<String> createTablesSQL(); <T> void assignValuesByInstance(String tableName, T t, ContentValues values); <T> T newInstanceByCursor(String tableName, Cursor cursor); } private static final String ILLEGAL_OPREATION = "非法操作,请先进行初始化操作:LouSQLite.init()"; private static LouSQLite INSTANCE; public static void init(Context context, ICallBack callBack) { if (INSTANCE == null) { INSTANCE = new LouSQLite(context, callBack); } } public static <T> void insert(String tableName, T t) { if (INSTANCE == null) { throw new IllegalStateException(ILLEGAL_OPREATION); } SQLiteDatabase db = INSTANCE.getWritableDatabase(); db.beginTransaction(); try { ContentValues values = new ContentValues(); INSTANCE.mCallBack.assignValuesByInstance(tableName, t, values); db.insert(tableName, null, values); values.clear(); db.setTransactionSuccessful(); } finally { db.endTransaction(); db.close(); } } public static <T> void insert(String tableName, List<T> ts) { if (INSTANCE == null) { throw new IllegalStateException(ILLEGAL_OPREATION); } SQLiteDatabase db = INSTANCE.getWritableDatabase(); db.beginTransaction(); try { ContentValues values = new ContentValues(); for (T t : ts) { INSTANCE.mCallBack.assignValuesByInstance(tableName, t, values); db.insert(tableName, null, values); values.clear(); } db.setTransactionSuccessful(); } finally { db.endTransaction(); db.close(); } } public static <T> void update(String tableName, T t, String whereClause, String[] whereArgs) { if (INSTANCE == null) { throw new IllegalStateException(ILLEGAL_OPREATION); } SQLiteDatabase db = INSTANCE.getWritableDatabase(); db.beginTransaction(); try { ContentValues values = new ContentValues(); INSTANCE.mCallBack.assignValuesByInstance(tableName, t, values); db.update(tableName, values, whereClause, whereArgs); values.clear(); db.setTransactionSuccessful(); } finally { db.endTransaction(); db.close(); } } public static <T> void update(String tableName, List<T> ts, String whereClause, String[] whereArgs) { if (INSTANCE == null) { throw new IllegalStateException(ILLEGAL_OPREATION); } SQLiteDatabase db = INSTANCE.getWritableDatabase(); db.beginTransaction(); try { ContentValues values = new ContentValues(); for (T t : ts) { INSTANCE.mCallBack.assignValuesByInstance(tableName, t, values); db.update(tableName, values, whereClause, whereArgs); values.clear(); } db.setTransactionSuccessful(); } finally { db.endTransaction(); db.close(); } } public static void delete(String tableName, String whereClause, String[] whereArgs) { if (INSTANCE == null) { throw new IllegalStateException(ILLEGAL_OPREATION); } SQLiteDatabase db = INSTANCE.getWritableDatabase(); db.beginTransaction(); try { db.delete(tableName, whereClause, whereArgs); db.setTransactionSuccessful(); } finally { db.endTransaction(); db.close(); } } public static <T> List<T> query(String tableName, @NonNull String queryStr, @Nullable String[] whereArgs) { if (INSTANCE == null) { throw new IllegalStateException(ILLEGAL_OPREATION); } List<T> lists = new ArrayList<>(); SQLiteDatabase db = INSTANCE.getReadableDatabase(); db.beginTransaction(); try { db.setTransactionSuccessful(); Cursor cursor = db.rawQuery(queryStr, whereArgs); if (cursor.moveToFirst()) { do { T tt = INSTANCE.mCallBack.newInstanceByCursor(tableName, cursor); if (tt != null) { lists.add(tt); } } while (cursor.moveToNext()); } cursor.close(); } finally { db.endTransaction(); db.close(); } return lists; } /////////////////////////////////////////////////////////////////////////// // Self /////////////////////////////////////////////////////////////////////////// private final ICallBack mCallBack; private static final String TAG = "LouSQLite"; private LouSQLite(@NonNull Context context, @NonNull ICallBack callBack) { super(context, callBack.getName(), null, callBack.getVersion()); mCallBack = callBack; } @Override public void onCreate(SQLiteDatabase db) { for (String create_table : mCallBack.createTablesSQL()) { db.execSQL(create_table); Log.d(TAG, "create table " + "[ \n" + create_table + "\n ]" + " successful! "); } } @Override public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) { mCallBack.doUpgrade(sqLiteDatabase, oldVersion, newVersion); } }
相关文章推荐
- Android Studio使用远程依赖时下载不了jar包的解决方法
- 【Android】通用系列 —— 数据持久化(通用的SharedPreference封装)
- [ IP forward ] with Android 4.0 don't work
- android中CoordinatorLayout结合TollBar自定义View的使用效果
- Android studio -SVN 使用笔记
- Android RecyclerView框架使用详解
- Android中的Service
- Android中自定义ListView实现上拉加载更多和下拉刷新
- Android自定义View实现随机验证码
- Android内存泄漏的八种可能
- Android流式布局的实现原理
- [android-x86] IP forwarding
- Android图片呈现圆角化
- Android头部视差效果的实现方式
- android的帧动画和补间动画总结
- RecyclerView学习
- EventBus3 简单使用及注意点
- Android将String类型字符串转换成utf-8,gbk格式
- 学习过程中的好文章收集
- 在Android中访问内置SE和基于SE的卡模拟(一)