您的位置:首页 > 移动开发 > Android开发

【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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: