框架整理系列一(數(shù)據(jù)庫)

DBHelper.java

public class DBHelper extends SQLiteOpenHelper {
// 默認(rèn)本數(shù)據(jù)庫名稱
private static final String DATABASE_NAME = "lhoa.db";

// 表集合
//public static Class<?>[] ClassList = new Class[]{FarmerTable.class, DiseaseTable.class};
public static ArrayList<Class> ClassList = new ArrayList<>();

/**
 * 數(shù)據(jù)庫版本升級
 */
private static final int DATABASE_VERSION = 7; //2.0增加藥品庫位和ID
/**
 * @param context
 */
public DBHelper(Context context) {
//
super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

/**
 * @param context
 * @param dataName
 */
public DBHelper(Context context, String dataName) {
//
super(context, dataName, null, DATABASE_VERSION);
}

/**
 * @param context
 * @param dataName
 * @param version
 */
public DBHelper(Context context, String dataName, int version) {
//
super(context, dataName, null, version);
}

@Override
public void onCreate(SQLiteDatabase db) {
try {
Log.i("Sqlite", "Create dataBase**********************");
if (ClassList.size() > 0) {
for (int i = 0; i < ClassList.size(); i++) {
String tableName = ClassList.get(i).getSimpleName();
Field[] declaredFields = ClassList.get(i).getDeclaredFields(); // 加局部變量
// 遍歷方法集合
Log.i("OrmHelper", "=== start traversing getXX methods===="+tableName);
// 如果類里面的變量數(shù)目大于0,新建基礎(chǔ)表
if (declaredFields.length > 0) {
db.execSQL("DROP TABLE IF EXISTS " + tableName);
db.execSQL("CREATE TABLE IF NOT EXISTS " + tableName + " (_id INTEGER PRIMARY KEY AUTOINCREMENT )");
for (int m = 0; m < declaredFields.length; m++) { //針對類里每個(gè)屬性增加表的各個(gè)字段
Class<?> cl = declaredFields[m].getType();
String TypeName = cl.getSimpleName();
if (TypeName.equals("int") || TypeName.equals("double") || TypeName.equals("float")) {
db.execSQL("ALTER TABLE " + tableName + " ADD '" + declaredFields[m].getName() + "' INTEGER");
} else {
db.execSQL("ALTER TABLE " + tableName + " ADD '" + declaredFields[m].getName() + "' VARCHAR");
}
}
}
}
}

} catch (Exception e) {
// TODO: handle exception
Log.i("Set_ZeroError", e.getClass().toString());
}
}

//
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
Log.i("Sqlite", "ALTER dataBase *******************************");
if (oldVersion < DATABASE_VERSION) {
try {
 onCreate(db);
  //  UpdateDB(db);
} catch (Exception e) {
// TODO: handle exception
Log.e("Sql_error", e.getMessage().toString());
}
}
}

/**
 * 重置數(shù)據(jù)
 */
public void SetZero(String TableName) {
}

public static void DeleteDataBase(Context context) {
context.deleteDatabase(DATABASE_NAME);
}

/**
 * 判斷表是否存在煎楣,若不存在犬金,則創(chuàng)建
 *
 * @param context
 * @param cls
 */
public static void CreateTableWithJudge(Context context, Class<?> cls) {
if (!isHave(context, cls)) {
CreateTable(context, cls);
}
}

public static boolean isHave(Context context, Class<?> userClass) {
boolean result = false;
try {
DBHelper db = new DBHelper(context);
SQLiteDatabase database = db.getWritableDatabase();
String tableName = userClass.getSimpleName();
String sql = "select * from sqlite_sequence where name like  '" + tableName + "'";
Cursor cursor = database.rawQuery(sql, null);
if (cursor.getCount() > 0) {
result = true;
} else {
result = false;
}
cursor.close();
database.close();
} catch (Exception ex) {
ex.fillInStackTrace();
}
return result;
}

/**
 * 快捷建表 表名 Equip
 * 例:DBHelper.CreateTable(CariAndroidOrmPronActivity.this,Equip.class);
 *
 * @param userClass
 */
public static void CreateTable(Context context, Class<?> userClass) {
try {
DBHelper db = new DBHelper(context);
SQLiteDatabase database = db.getWritableDatabase();
String tableName = userClass.getSimpleName();
Field[] methods = userClass.getDeclaredFields(); // 加載變量屬性
// 遍歷方法集合
Log.i("OrmHelper", "=== start traversing getXX methods===="+tableName);
// 如果類里面的變量數(shù)目大于0,新建基礎(chǔ)表
if (methods.length > 0) {
database.execSQL("CREATE TABLE IF NOT EXISTS " + tableName + " (_id INTEGER PRIMARY KEY AUTOINCREMENT )");
Log.i("OrmHelper","CREATE TABLE IF NOT EXISTS " + tableName + " (_id INTEGER PRIMARY KEY AUTOINCREMENT )");
}
for (int i = 0; i < methods.length; i++) {
Class<?> cl = methods[i].getType();
String TypeName = cl.getSimpleName();
if (TypeName.equals("int")) {
Log.i("OrmHelper","ALTER TABLE " + tableName + " ADD '" + methods[i].getName() + "' int");
database.execSQL("ALTER TABLE " + tableName + " ADD '" + methods[i].getName() + "' int");
} else {
Log.i("OrmHelper","ALTER TABLE " + tableName + " ADD '" + methods[i].getName() + "' VARCHAR");
database.execSQL("ALTER TABLE " + tableName + " ADD '" + methods[i].getName() + "' VARCHAR");
}
}
database.close();
db.close();
Log.i("OrmHelper", "=== end ====");
} catch (Exception e) {
e.printStackTrace();
}
}

/**
 * 升級數(shù)據(jù)庫
 */
public void UpdateDB(SQLiteDatabase db) {
if (ClassList.size() > 0) {
for (int i = 0; i < ClassList.size(); i++) {
String tableName = ClassList.get(i).getSimpleName();
Field[] methods = ClassList.get(i).getDeclaredFields(); // 加載變量屬性,加載所有字段
CompareTableAndCreate(db, tableName, methods);
}
}
}

/**
 * 對比需要生成的數(shù)據(jù)庫表與設(shè)備中當(dāng)前存在的數(shù)據(jù)庫表的差別瘪吏,并對有差別的表進(jìn)行刪除和重建
 */
private static void CompareTableAndCreate(SQLiteDatabase db, String table, Field[] methods) {
// if(clear)
// db.execSQL("drop table if exists "+table);
String sql = "_id INTEGER PRIMARY KEY AUTOINCREMENT";
for (int i = 0; i < methods.length; i++) {
Class<?> cl = methods[i].getType();
String TypeName = cl.getSimpleName();
if (TypeName.equals("int"))
sql = sql + "," + methods[i].getName() + " int";
else
sql = sql + "," + methods[i].getName() + " VARCHAR";
}

// 判斷新數(shù)據(jù)庫的字段是否與舊數(shù)據(jù)庫一致,不一致則刪除重建
boolean a = true;
for (int j = 0; j < methods.length; j++) {
a = checkColumnExist(db, table, methods[j].getName());
if (a == false)
break;
}
if (a == false) {
Log.i("CompareTableAndCreate", table);
db.execSQL("drop table if exists " + table);
db.execSQL("create table if not exists " + table + "(" + sql + ")");
} else
db.execSQL("create table if not exists " + table + "(" + sql + ")");

}

/**
 * 判斷需要生成的表中的字段與數(shù)據(jù)庫中已有的表的字段是否一致
 */
static public boolean checkColumnExist(SQLiteDatabase db, String tableName, String columnName) {
boolean result = true;
Cursor cursor = null;
int index = -1;
try {
// 查詢一行
cursor = db.rawQuery("SELECT * FROM " + tableName + " LIMIT 0", null);
if (cursor != null) {
index = cursor.getColumnIndex(columnName);
if (index == -1)
result = false;
} else
result = false;
} catch (Exception e) {
Log.i("checkColumnExistError", e.getMessage());
result = false;
} finally {
if (null != cursor && !cursor.isClosed()) {
cursor.close();
}
}
return result;
}

}

DataBaseUtil.java

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.Field;
import java.nio.channels.FileChannel;
import java.util.ArrayList;


/**
 * @author zhouzhou
 * @Title: SqliteHelper
 * @Description:
 * @Company: www.cari.com.cn
 * @date 2015-9-24 下午5:03:18
 */
public class DataBaseUtil {
/**
 * 反射機(jī)制告材,從數(shù)據(jù)庫到數(shù)據(jù)表
 *
 * @param context
 * @param cls
 * @return
 */
@SuppressWarnings("unchecked")
public static ArrayList<Object> GetData(Context context, Class cls) {
return GetData(context, cls, "");
}

public static Object GetOneData(Context context, Class cls, String sqlStr){
ArrayList<Object> datas = GetData(context,cls,sqlStr);
if(datas.size()>0){
return datas.get(0);
}else {
return null;
}
}

/**
 * 反射機(jī)制齿拂,從數(shù)據(jù)庫到數(shù)據(jù)表
 *
 * @param context
 * @param cls
 * @return
 */
@SuppressWarnings("unchecked")
public static ArrayList<Object> GetData(Context context, Class cls, String sqlStr) {
ArrayList<Object> resultList = new ArrayList<Object>();
try {
DBHelper dbhelper = new DBHelper(context);
SQLiteDatabase db = dbhelper.getReadableDatabase(); // 上傳id大于多少的....
String selectStr = cls.getDeclaredFields()[0].getName();
for (int i = 1; i < cls.getDeclaredFields().length; i++) {
selectStr = selectStr + "," + cls.getDeclaredFields()[i].getName();
}
Cursor cursor = db.rawQuery("SELECT " + selectStr + " FROM " + cls.getSimpleName() + " " + sqlStr, null);
for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor.moveToNext()) {
Object obj = cls.newInstance();
for (int i = 0; i < cursor.getColumnCount(); i++) {
if (cursor.getString(i) != null) {
ReflectionHelper.doMethod("set" + toUpperCaseFirstOne(cursor.getColumnName(i)), obj, cursor.getString(i), cls.getDeclaredFields()[i].getType());
}
}
resultList.add(obj);
}
if (cursor != null) {
cursor.close();
}
db.close();
dbhelper.close();
} catch (Exception e) {
// TODO: handle exception
Log.e("SQLite ERROR", e.getMessage().toString());
}
return resultList;
}

/**
 * 向數(shù)據(jù)庫中插入數(shù)據(jù)ArrayList
 *
 * @param context
 * @param cls
 * @param
 */
public static void saveArrayListData(Context context, Class<?> cls, Object obj) {
String JsonStr = GsonUtil.toJson(obj);
JSONArray jsonArray = null;
try {
jsonArray = new JSONArray(JsonStr);
saveJsonArrayData(context, cls, jsonArray);
} catch (JSONException e) {
e.printStackTrace();
}
}

/**
 * 向數(shù)據(jù)庫中插入單個(gè)數(shù)據(jù)
 *
 * @param context
 * @param cls
 * @param
 */
public static void saveObjectData(Context context, Class<?> cls, Object obj) {
String JsonStr = GsonUtil.toJson(obj);
JSONObject jsonObject = null;
try {
jsonObject = new JSONObject(JsonStr);
} catch (JSONException e) {
e.printStackTrace();
}
saveJsonObjct(context, cls, jsonObject);
}

/**
 * 插入JsonArray
 *
 * @param context
 * @param cls
 * @param jsonArray
 */
public static void saveJsonArrayData(Context context, Class<?> cls, JSONArray jsonArray) {
DBHelper db = new DBHelper(context);
SQLiteDatabase dataBase = db.getWritableDatabase();
try {
dataBase.beginTransaction(); // 手動(dòng)設(shè)置開始事務(wù)
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject itemdata = (JSONObject) jsonArray.get(i);
dataBase.insert(cls.getSimpleName(), null, InSertContentValues(cls, itemdata));
}
dataBase.setTransactionSuccessful(); // 設(shè)置事務(wù)處理成功,不設(shè)置會(huì)自動(dòng)回滾不提交
Log.i("SQLite", "Success insert info into SqliteDatabase " + cls.getSimpleName());

} catch (Exception e) {
Log.e("SQLite ERROR " + cls.getSimpleName(), e.getMessage().toString());
} finally {
dataBase.endTransaction(); // 處理完成
dataBase.close();
db.close();
}
}

/**
 * 插入JSONObject
 *
 * @param context
 * @param cls
 * @param jsonObject
 */
public static void saveJsonObjct(Context context, Class<?> cls, JSONObject jsonObject) {
DBHelper db = new DBHelper(context);
SQLiteDatabase dataBase = db.getWritableDatabase();
try {
dataBase.insert(cls.getSimpleName(), null, InSertContentValues(cls, jsonObject));
Log.i("SQLite", "Success insert info into SqliteDatabase " + cls.getSimpleName());
} catch (Exception e) {
Log.e("SQLite ERROR " + cls.getSimpleName(), e.getMessage().toString());
} finally {
dataBase.endTransaction(); // 處理完成
dataBase.close();
db.close();
}
}

/**
 * 向ContentValues插入JSONObject
 *
 * @param cls
 * @param jsonObject
 * @return
 * @throws JSONException
 */
public static ContentValues InSertContentValues(Class<?> cls, JSONObject jsonObject) throws JSONException {
ContentValues cv = new ContentValues();
JSONObject itemdata = jsonObject;
Field[] fields = cls.getDeclaredFields();
for (int j = 0; j < fields.length; j++) {
        if (itemdata.has(fields[j].getName().toString())) {
cv.put(fields[j].getName().toString(), itemdata.getString(fields[j].getName().toString()));
}
}
return cv;
}

/**
 * 清空指定數(shù)據(jù)表
 *
 * @param context
 * @param cls
 */
public static void clearTable(Context context, Class<?> cls) {
DBHelper db = new DBHelper(context);
SQLiteDatabase dataBase = db.getWritableDatabase();
try {
dataBase.execSQL("delete from " + cls.getSimpleName());
} catch (Exception e) {
Log.e("SQLite ERROR " + cls.getSimpleName(), e.getMessage().toString());
} finally {
dataBase.close();
db.close();
}
}

public static void getOutDataBase() {
File f = new File("/data/data/com.lihua.oa/databases/lhoa.db"); //比如  "/data/data/com.hello/databases/test.db"
String sdcardPath = Environment.getExternalStorageDirectory().getAbsolutePath();
File o = new File(sdcardPath + "/cp.db"); //sdcard上的目標(biāo)地址
if (f.exists()) {
FileChannel outF;
try {
outF = new FileOutputStream(o).getChannel();
new FileInputStream(f).getChannel().transferTo(0, f.length(), outF);
Log.e("sqlite", "數(shù)據(jù)庫拷貝成功");
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}

//首字母轉(zhuǎn)大寫
public static String toUpperCaseFirstOne(String s)
{
if(Character.isUpperCase(s.charAt(0)))
return s;
else
return (new StringBuilder()).append(Character.toUpperCase(s.charAt(0))).append(s.substring(1)).toString();
}
}

ReflectionHelper.java

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

/**
 * @author zhouzhou
 * @Title: ReflectionHelper
 * @Description:
 * @Company: www.cari.com.cn
 * @date 2015-9-24 下午4:01:53
 */
public class ReflectionHelper {
/**
 * 快捷填充對象(標(biāo)準(zhǔn)化的對象)
 *
 * @param MethodName
 * @param o  調(diào)用此方法的對象
 * @param paras  調(diào)用的這個(gè)方法的參數(shù)參數(shù)列表
 */
public static void getMethod(String MethodName, Object o, Object[] paras) {
Class c[] = null;
if (paras != null) {// 存在
int len = paras.length;
c = new Class[len];
for (int i = 0; i < len; ++i) {
c[i] = paras[i].getClass();
}
}
try {
Method method = null;
if (c[0].getSimpleName().equals("Integer")) {
method = o.getClass().getDeclaredMethod(MethodName, int.class);
} else {
method = o.getClass().getDeclaredMethod(MethodName, c);
}
try {
method.invoke(o, paras);// 調(diào)用o對象的方法
} catch (IllegalAccessException ex) {
ex.fillInStackTrace();
} catch (IllegalArgumentException ex) {
ex.fillInStackTrace();
} catch (InvocationTargetException ex) {
ex.fillInStackTrace();
}
} catch (NoSuchMethodException ex) {
ex.fillInStackTrace();
} catch (SecurityException ex) {
ex.fillInStackTrace();
}

}

public static void getMethod(String MethodName, Object o, Object paras) {
Class c = null;
if (paras != null) {// 存在
c = paras.getClass();
}
try {
Method method = null;
if (c.getSimpleName().equals("Integer")) {
method = o.getClass().getDeclaredMethod(MethodName, int.class);
} else {
method = o.getClass().getDeclaredMethod(MethodName, c);
}
try {
method.invoke(o, paras);// 調(diào)用o對象的方法
} catch (IllegalAccessException ex) {
ex.fillInStackTrace();
} catch (IllegalArgumentException ex) {
ex.fillInStackTrace();
} catch (InvocationTargetException ex) {
ex.fillInStackTrace();
}
} catch (NoSuchMethodException ex) {
ex.fillInStackTrace();
} catch (SecurityException ex) {
ex.fillInStackTrace();
}

}

public static void doMethod(String MethodName, Object o, Object paras) {
Class c = null;
if (paras != null) {// 存在
c = paras.getClass();
}
try {
Method method = null;
if (c.getSimpleName().equals("Integer")) {
method = o.getClass().getDeclaredMethod(MethodName, int.class);
} else {
method = o.getClass().getDeclaredMethod(MethodName, c);
}
try {
method.invoke(o, paras);// 調(diào)用o對象的方法
} catch (IllegalAccessException ex) {
ex.fillInStackTrace();
} catch (IllegalArgumentException ex) {
ex.fillInStackTrace();
} catch (InvocationTargetException ex) {
ex.fillInStackTrace();
}
} catch (NoSuchMethodException ex) {
ex.fillInStackTrace();
} catch (SecurityException ex) {
ex.fillInStackTrace();
}

}

public static void doMethod(String MethodName, Object o, String paras, Class parasType) {
try {
Method method = o.getClass().getDeclaredMethod(MethodName, parasType);
try {
if (parasType.equals(int.class)) {
method.invoke(o, Integer.parseInt(paras));
} else if (parasType.equals(Double.class)) {
method.invoke(o, Double.parseDouble(paras));
} else
method.invoke(o, paras);// 調(diào)用o對象的方法
} catch (IllegalAccessException ex) {
ex.fillInStackTrace();
} catch (IllegalArgumentException ex) {
ex.fillInStackTrace();
} catch (InvocationTargetException ex) {
ex.fillInStackTrace();
}
} catch (NoSuchMethodException ex) {
ex.fillInStackTrace();
} catch (SecurityException ex) {
ex.fillInStackTrace();
}

}
}

引用

1: 使用JSONTFORMAT 將json生成對應(yīng)格式的bean.class
2: 在MyApplication中初始化表孩等。

DBHelper.ClassList.add(DiseaseTable.class);
DBHelper.ClassList.add(FarmerTable.class);
DBHelper.ClassList.add(FeedTable.class);
DBHelper.ClassList.add(FeedDisplayTable.class);
DBHelper.ClassList.add(BaseFarmer.class);
DBHelper.ClassList.add(Medicine.class); //藥品

3:在接口中存儲(chǔ)/讀取表數(shù)據(jù):

public void success(JSONArray resultArray) {
    if (resultArray.length() > 0) {
        DataBaseUtil.clearTable(AreaMagrActivity.this, FeedTable.class);
        DataBaseUtil.saveJsonArrayData(AreaMagrActivity.this, FeedTable.class, resultArray);
        cancleDialog();
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末艾君,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子肄方,更是在濱河造成了極大的恐慌冰垄,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件权她,死亡現(xiàn)場離奇詭異播演,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)伴奥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進(jìn)店門写烤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人拾徙,你說我怎么就攤上這事洲炊。” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵暂衡,是天一觀的道長询微。 經(jīng)常有香客問我,道長狂巢,這世上最難降的妖魔是什么撑毛? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮唧领,結(jié)果婚禮上藻雌,老公的妹妹穿的比我還像新娘。我一直安慰自己斩个,他們只是感情好胯杭,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著受啥,像睡著了一般做个。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上滚局,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天居暖,我揣著相機(jī)與錄音,去河邊找鬼藤肢。 笑死膝但,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的谤草。 我是一名探鬼主播跟束,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼丑孩!你這毒婦竟也來了冀宴?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤温学,失蹤者是張志新(化名)和其女友劉穎略贮,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體仗岖,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡逃延,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了轧拄。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片揽祥。...
    茶點(diǎn)故事閱讀 40,137評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖檩电,靈堂內(nèi)的尸體忽然破棺而出拄丰,到底是詐尸還是另有隱情府树,我是刑警寧澤,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布料按,位于F島的核電站奄侠,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏载矿。R本人自食惡果不足惜垄潮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望闷盔。 院中可真熱鬧弯洗,春花似錦、人聲如沸馁筐。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽敏沉。三九已至,卻和暖如春炎码,著一層夾襖步出監(jiān)牢的瞬間盟迟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工潦闲, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留攒菠,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓歉闰,卻偏偏與公主長得像辖众,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子和敬,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,086評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理凹炸,服務(wù)發(fā)現(xiàn),斷路器昼弟,智...
    卡卡羅2017閱讀 134,672評論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法啤它,類相關(guān)的語法,內(nèi)部類的語法舱痘,繼承相關(guān)的語法变骡,異常的語法,線程的語...
    子非魚_t_閱讀 31,644評論 18 399
  • 文章作者:Tyan博客:noahsnail.com 3.4 Dependencies A typical ente...
    SnailTyan閱讀 4,166評論 2 7
  • 情人谷入口處的這段路上芭逝,一步一個(gè)愛字塌碌,每個(gè)愛的字體都不一樣,我隨手拍了一些旬盯,但遠(yuǎn)遠(yuǎn)沒有拍完誊爹。再往里走蹬刷,有一塊一人來...
    張方平閱讀 356評論 0 1
  • 4月16日办成,電視劇《白鹿原》在安徽衛(wèi)視和江蘇衛(wèi)視首播,但僅僅播出一集就遭停播搂漠,并于5月10日重新返回電視屏幕迂卢。播放...
    奇藝姑娘閱讀 3,972評論 9 24