編輯:關於Android編程
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">// 初始化
LouSQLite.init(mContext, MyCallBack.getInstance());
Phrase phrase = new Phrase("青青子衿,悠悠我心");
// 插入一個數據到數據庫
LouSQLite.insert(MyCallBack.TABLE_PHRASE, phrase);
// 插入一組數據
List 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()});
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">//: 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 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;
}
}
//: 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">//: 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 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);
}
}
Android自定義屬性為應用程序設置全局背景
關於自定義屬性,我們用的比較多的時候就是在自定義view的時候了,其實自定義屬性還有一些其余的妙用。這裡講解一個利用自定義的屬性為應用程序全局的替換背景的例子。1.And
Android 輕松實現網絡交互模板
看完本文,您可以學到:1.Android與後台交互的模板化方法 2.JSON的使用3.檢查網絡連接4.AsyncTask的使用我們簡單的以登錄為例,來實現整個的
android使用PullToRefresh實現下拉刷新和上拉加載
PullToRefresh是一套實現非常好的下拉刷新庫,它支持:1.ListView2.ExpandableListView3.GridView4.WebView等多種常
分析Redis架構設計
一、前言因為近期項目中開始使用Redis,為了更好的理解Redis並應用在適合的業務場景,需要對Redis設計與實現深入的理解。我分析流程是按照從main進入,逐步深入分