SQLite數(shù)據(jù)庫(kù)簡(jiǎn)單使用

關(guān)于原理和優(yōu)缺點(diǎn)本文暫不表述掌栅,在使用過(guò)程中也沒(méi)有太多的十幾意義谒麦,所以直接上操作步驟:

一:首先是在sqliteexpert中操作數(shù)據(jù)庫(kù)

1.首先可以下載一個(gè)數(shù)據(jù)庫(kù)的查看工具:

SQLiteExpert

下載安裝

2.新建數(shù)據(jù)庫(kù)

(1)file->new database->選擇路徑->輸入數(shù)據(jù)庫(kù)的名字->選擇->ok

(2)左上角第一個(gè)按鈕->選擇路徑->輸入數(shù)據(jù)庫(kù)的名字->選擇->ok

3.新建表

(1)使用SQL創(chuàng)建樱蛤,將窗口打開(kāi)到SQL状原,輸入語(yǔ)句:

creat table 表名(
    列名 數(shù)據(jù)類(lèi)型 列級(jí)完整性約束條件,
    列名 數(shù)據(jù)類(lèi)型 列級(jí)完整性約束條件,
     列名 數(shù)據(jù)類(lèi)型 列級(jí)完整性約束條件,
     列名 數(shù)據(jù)類(lèi)型 列級(jí)完整性約束條件
)

舉例:
create table fruits(
      _id integer primary key autoincrement,      
      name varchar not null,      
      img varchar
)

(2)使用圖標(biāo)創(chuàng)建表

創(chuàng)建表-表名.png

新建表.png

4.DML語(yǔ)句:表的操作-添加

insert into 表名 (列1,列2) vlues (值1,值2)
舉例:
insert into fruits (name,img) values ('香蕉','https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1597409441176&di=da6f0b1d893dc23dc1c89608100e9915&imgtype=0&src=http%3A%2F%2Fimg.yzcdn.cn%2Fupload_files%2F2015%2F06%2F06%2FFvZNxCm5eyda1t7Etz_BnO0jGyUF.jpg')

添加一條數(shù)據(jù).png

注意點(diǎn):(1)數(shù)據(jù)類(lèi)型需要對(duì)應(yīng)(2)數(shù)據(jù)個(gè)數(shù)要對(duì)應(yīng)卧檐,(3)數(shù)據(jù)順序要對(duì)應(yīng)(4)一定要包含非空列(5)自動(dòng)增列的處理:一般默認(rèn)不用處理缝呕,但是遇到需要處理的時(shí)候怠堪,這樣處理a为障。給一個(gè)不存在的數(shù)據(jù)b給一個(gè)null

//跟上面的比較而言吭从,表名后面沒(méi)有列名
//默認(rèn)所有列都要插入數(shù)據(jù)便脊,包括主鍵
insert into 表名 vlues (值1,值2)
舉例:
insert into fruits  values (null,'蘋(píng)果','https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1597410334135&di=9d74180ef697ff7dbdcc154844f3c6dc&imgtype=0&src=http%3A%2F%2Ffile.youboy.com%2Fa%2F106%2F47%2F29%2F7%2F13151677s.jpg')
第二種插入數(shù)據(jù)方法.png

5.DML語(yǔ)句:表的操作-刪除

//刪除所有數(shù)據(jù)
delete from fruits
//帶條件的刪除
delete from fruits where name='蘋(píng)果'

注意:刪除是針對(duì)記錄而言的胶台,就是說(shuō)刪除的是某一列假褪,而不能針對(duì)某一行署咽,所以delete和from中間不要添加任何的條件

6.DML語(yǔ)句:表的操作-修改更新

update 表名 set 列名1=更新值1,列名2=更新值2,列名n=更新值n 【條件】
//所有的數(shù)據(jù)的name都修改成了大蘋(píng)果
update fruits set name='大蘋(píng)果'

//_id是20的數(shù)據(jù)name改成了大紅蘋(píng)果宁否,注意如果條件不存在窒升,則沒(méi)有數(shù)據(jù)受影響
update fruits set name='大紅蘋(píng)果' where _id=20

7.DML語(yǔ)句:表的操作-查詢(xún)

查詢(xún)產(chǎn)生的結(jié)果是一個(gè)虛擬的結(jié)果集,并不是真正的講數(shù)據(jù)拿出來(lái)慕匠,這包括兩個(gè)意思:一是查詢(xún)結(jié)果是一個(gè)集合饱须,有很多條數(shù)據(jù)構(gòu)成的集合二是查詢(xún)操作不會(huì)對(duì)數(shù)據(jù)庫(kù)造成數(shù)據(jù)的變動(dòng)
//查詢(xún)所有
select * from 表名
//查詢(xún)部分列
select 列名1,列名2 from 表名
select name from fruits 
select img from fruits 
select name ,img from fruits 
//帶條件的查詢(xún)
select * from 表名 where 條件
select * from fruits where name='大紅蘋(píng)果'//注意這里的*也可以換成其他的條件*代表的是全部列,也可以用name和img或者——id替換


查詢(xún)?nèi)?png
查詢(xún)部分(img).png
查詢(xún)部分(name).png
查詢(xún)部分(name,img).png
帶條件的查詢(xún).png

二:Android中SQLite的操作

1.首先認(rèn)識(shí)一下SQLiteOpenHelper:安卓平臺(tái)中數(shù)據(jù)庫(kù)的輔助類(lèi)台谊,用于創(chuàng)建或者打開(kāi)數(shù)據(jù)庫(kù)蓉媳,并且對(duì)數(shù)據(jù)庫(kù)的創(chuàng)建和版本進(jìn)行管理。

 String dbPath = Environment.getExternalStorageState() + "sqlitedemo.db";
                /**
                 *
                 * context this
                 * path 數(shù)據(jù)庫(kù)名稱(chēng):如果只給一個(gè)名稱(chēng)锅铅,那么會(huì)在項(xiàng)目的私有目錄文件夾中創(chuàng)建data->com.包名->數(shù)據(jù)庫(kù)文件
                 *                 如果給了具體的位置酪呻,那么會(huì)在置頂位置創(chuàng)建
                 * factory 游標(biāo)工廠,給null會(huì)有一個(gè)默認(rèn)的
                 * version 版本號(hào)
                 */
                SQLiteOpenHelper helper = new SQLiteOpenHelper(this, dbPath, null, 1) {

                    //創(chuàng)建
                    @Override
                    public void onCreate(SQLiteDatabase db) {

                    }

                    //升級(jí)
                    @Override
                    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

                    }
                };
                //用于獲取數(shù)據(jù)庫(kù)對(duì)象盐须,如果存在就打開(kāi)号杠,否則就創(chuàng)建
                //當(dāng)版本號(hào)比原來(lái)的高德時(shí)候,就會(huì)升級(jí)onUpgrade
                helper.getReadableDatabase();

2.SQLiteDatabase:用于管理和操作數(shù)據(jù)庫(kù)的類(lèi)丰歌,基本上所有的數(shù)據(jù)庫(kù)的操作都是最終通過(guò)他來(lái)完成的姨蟋。而第一步的 helper.getReadableDatabase();的返回值就是一個(gè)SQLiteDatabase。所以:

//獲取SQLiteDatabase 對(duì)象
 SQLiteDatabase sqLiteDatabase = helper.getReadableDatabase();

SQLiteDatabase對(duì)象的操作:

 rawQuery();//查詢(xún)
 execSQL();//增加立帖,刪除眼溶,修改,創(chuàng)建表

因?yàn)閿?shù)據(jù)庫(kù)的操作的前提是必須有數(shù)據(jù)庫(kù)晓勇,沒(méi)有的話就會(huì)創(chuàng)建數(shù)據(jù)庫(kù)堂飞,所以表的創(chuàng)建也應(yīng)該是在數(shù)據(jù)庫(kù)創(chuàng)建的時(shí)候完成的,所以绑咱,在創(chuàng)建數(shù)據(jù)庫(kù)的方法中使用 execSQL()方法創(chuàng)建表绰筛。也可以在外面創(chuàng)建,這個(gè)根據(jù)具體情況而定描融。

 rawQuery();//查詢(xún)
 execSQL();//增加铝噩,刪除,修改窿克,創(chuàng)建表

3.增加數(shù)據(jù):通過(guò)第二步就知道了骏庸,操作數(shù)據(jù)庫(kù)需要用到的是SQLiteDatabase的 execSQL()。所以在得到SQLiteDatabase對(duì)象以后就可以進(jìn)行添加操作了年叮。

//獲取到需要添加的值
               String nameStr = inputName.getText().toString();
                String imgStr = inputImg.getText().toString();

//第一種添加方法:完成編輯sql語(yǔ)句
                String sqlStr = "insert into test_tb (name,img,type) values ('" +
                        nameStr + "','" + imgStr + "'," + mType +
                        ")";
                sqLiteDatabase.execSQL(sqlStr);
//第二種添加方法:用具被?占位,用,new String[]{}傳入相應(yīng)的值只损,這里面需要傳入string類(lèi)型的值一姿,他會(huì)自動(dòng)根據(jù)數(shù)據(jù)類(lèi)型做相應(yīng)的轉(zhuǎn)化
                String slqArrStr="insert into test_tb (name,img,type) values (?,?,?)";
                sqLiteDatabase.execSQL(slqArrStr,new String[]{nameStr,imgStr,String.valueOf(mType)});

4查詢(xún)數(shù)據(jù),添加數(shù)據(jù)之后就可以查詢(xún)數(shù)據(jù)了

 //select * from 表名 where _id = ?

 String querySql = "select * from test_tb";
   if (mType != 0) {
    querySql += " where type=" + mType;
   }
   //查詢(xún)結(jié)果
   Cursor c = sqLiteDatabase.rawQuery(querySql, null);
//關(guān)于Cursor 可以使用SimpleCursorAdapter結(jié)合listview實(shí)現(xiàn),也可以轉(zhuǎn)成list用recyclerview實(shí)現(xiàn)
          if (!c.moveToFirst()) {//為空的Cursor
                    myAdapter.replaceData(datas);
                    Toast.makeText(MainActivity.this, "沒(méi)有數(shù)據(jù)", Toast.LENGTH_LONG).show();
                    return;
                }

                while (c.moveToNext()) {//光標(biāo)移動(dòng)成功 把數(shù)據(jù)取出
                    SqliteBean sqliteBean = new SqliteBean();
                    sqliteBean.setId(c.getInt(c.getColumnIndex("_id")));
                    sqliteBean.setName(c.getString(c.getColumnIndex("name")));
                    sqliteBean.setImg(c.getString(c.getColumnIndex("img")));
                    sqliteBean.setType(c.getInt(c.getColumnIndex("type")));
                    datas.add(sqliteBean);
                }

                myAdapter.replaceData(datas);

5刪除:

//全部刪除
//delete from test_tb
//帶條件的刪除
//                        String delSql="delete from test_tb where _id=? ";
//                        sqLiteDatabase.execSQL(delSql,new String[]{String.valueOf( bean.getId())});
                        String delSql = "delete from test_tb where _id= " + bean.getId();
                        sqLiteDatabase.execSQL(delSql);

6修改

    String upsql = "update test_tb set name=? , img=?   where _id=?";
        sqLiteDatabase.execSQL(upsql,new String[]{newName,newImg,String.valueOf(sqliteBean.getId())});

7小結(jié):這種方法跟sqlite中的語(yǔ)句是一樣的叮叹,不過(guò)要注意的是sql語(yǔ)句的拼寫(xiě)和sqLiteDatabase對(duì)象的獲取

三:Android中SQLite的操作--API操作

1.除了編寫(xiě)sql語(yǔ)句對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作之外呢艾栋,安卓中還提供了一系列的api方法。當(dāng)然這些方法也是在sqLiteDatabase這個(gè)對(duì)象中衬横,所以我們使用api操作數(shù)據(jù)庫(kù)的時(shí)候還是需要首先獲取到sqLiteDatabase裹粤。sqLiteDatabase的api方法提供了基本的四個(gè)方法--增(insert)刪(delete)改(update)查(query)终蒂。他們都不需要自己編寫(xiě)sql語(yǔ)句蜂林。,只需要按照參數(shù)規(guī)則填寫(xiě)參數(shù)就行了拇泣。

2.增insert:返回剛剛添加的數(shù)據(jù)的id

  ContentValues contentValues=new ContentValues();
                contentValues.put("name",nameStr);
                contentValues.put("img",imgStr);
                contentValues.put("type",mType);
           /**
                 * 參數(shù)一:表名
                 * 參數(shù)二:可以為空的列噪叙。如果第三個(gè)參數(shù)為空或者沒(méi)有數(shù)據(jù),那么sql語(yǔ)句是“insert into 表名() values ()”此時(shí)在語(yǔ)法上是錯(cuò)誤的霉翔。此時(shí)通過(guò)參數(shù)三制定一個(gè)可空的列睁蕾,sql語(yǔ)句變成了“insert into 表名(可空列) values (null)”語(yǔ)法上是正確的。但是執(zhí)行不一定能通過(guò)债朵。所以說(shuō)參數(shù)二什么時(shí)候用子眶,用不用取決于第三個(gè)參數(shù)。
                 * 參數(shù)三:ContentValues--存的是鍵值對(duì)
                 *返回值: return 剛剛添加的數(shù)據(jù)的id
                 */
                Long insertId = sqLiteDatabase.insert("test_tb", null, contentValues);


3刪除delete

       /**
                         *參數(shù)1:表名
                         * 參數(shù)2:條件
                         * 參數(shù)3:條件值
                         * 返回:影響了多少行
                         */
                        int delId = sqLiteDatabase.delete("test_tb", "_id=?", new String[]{String.valueOf(bean.getId())});
                    

4.修改update

  ContentValues values = new ContentValues();
        //update info_tb set 列1=xx , 列2=xxx where 列名 = 值
        values.put("name",newName);
        values.put("img",newImg);
        values.put("type",sqliteBean.getType());
        int updateId = sqLiteDatabase.update("test_tb",values,"_id=?",new String[]{String.valueOf(sqliteBean.getId())});

5查詢(xún)query

         /**
                 *參數(shù)1:表名
                 * 參數(shù)2:查詢(xún)的列序芦,String[]{},null代表所有
                 * 參數(shù)3:條件臭杰,相當(dāng)于where后面的_id=? 不需要傳null
                 * 參數(shù)4:條件的值 ,相當(dāng)于_id=3中的3谚中,類(lèi)型是string[]{} 不需要傳null
                 * 參數(shù)5:分組渴杆,配合參數(shù)6使用。sql的語(yǔ)句是select count(*),type from 表名 group by type having type=2意思是查找按照type分組宪塔,并且要type=2的組磁奖,并且統(tǒng)計(jì)
                 * 參數(shù)6:當(dāng) group by對(duì)數(shù)據(jù)進(jìn)行分組后,可以通過(guò)having來(lái)去除不符合條件的組
                 * 參數(shù)7:排序
                 */
                Cursor c = sqLiteDatabase.query("test_tb", null, null, null, null, null, null);

四某筐,簡(jiǎn)單封裝

1.編輯DAO的類(lèi):

public class SQLiteDemoDao {
    //
    private SQLiteDatabase sqLiteDatabase;

    //構(gòu)造方法中實(shí)例化SQLiteDatabase
    public SQLiteDemoDao(Context context) {
        String dbPath = Environment.getExternalStorageDirectory() + "/sqlitedemo.db";
        SQLiteOpenHelper helper = new SQLiteOpenHelper(context, dbPath, null, 1) {
            @Override
            public void onCreate(SQLiteDatabase db) {
            }

            @Override
            public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {

            }
        };
        sqLiteDatabase = helper.getReadableDatabase();

    }

    public void addOneData(SqliteBean sqliteBean) {
        String sql = "insert into test_tb (name,img,type) values(?,?,?)";
        sqLiteDatabase.execSQL(sql, new Object[]{sqliteBean.getName(), sqliteBean.getImg(), sqliteBean.getType()});
    }

    /**
     * 查詢(xún)
     *
     * @param strs 長(zhǎng)度可以變化
     * @return 查詢(xún)結(jié)果
     */
    public Cursor getCursorData(String... strs) {
        //1.查詢(xún)所有(沒(méi)有參數(shù))
        String sql = "select * from test_tb ";
        //2.含條件查詢(xún)(名字/圖片/分類(lèi))(參數(shù)形式:第一個(gè)參數(shù)指明條件比搭,第二個(gè)參數(shù)指明條件值)
        if (strs.length != 0) {
            sql += " where " + strs[0] + "='" + strs[1] + "'";
        }
        Cursor c = sqLiteDatabase.rawQuery(sql, null);
        return c;
    }

    public ArrayList<SqliteBean> getDataInList(String... strs) {
        ArrayList<SqliteBean> list = new ArrayList<>();
        Cursor c = getCursorData(strs);
        while (c.moveToNext()) {
            int id = c.getInt(0);
            String name = c.getString(1);
            String img = c.getString(2);
            int type = c.getInt(3);
            SqliteBean s = new SqliteBean(id, name, img, type);
            list.add(s);
        }
        return list;
    }

    public void deleteData(String... strs) {
        String sql = "delete from test_tb where " + strs[0] + "='" + strs[1] + "'";
        sqLiteDatabase.execSQL(sql);
    }

    public void updateData(SqliteBean sqliteBean) {
        String sql = "update test_tb set name=?,img=?,type=? where _id=?";
        sqLiteDatabase.execSQL(sql, new Object[]{sqliteBean.getName(),
                sqliteBean.getImg(), sqliteBean.getType(), sqliteBean.getId()});
    }

}

2.初始化SQLiteDemoDao

 SQLiteDemoDao sqLiteDemoDao;

  @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
     。南誊。敢辩。。弟疆。戚长。
        sqLiteDemoDao = new SQLiteDemoDao(this);

}

3.增

  String nameStr = inputName.getText().toString();
                String imgStr = inputImg.getText().toString();
                SqliteBean sqliteBean = new SqliteBean(nameStr, imgStr, mType);
                sqLiteDemoDao.addOneData(sqliteBean);

4.刪

  sqLiteDemoDao.deleteData("_id",String.valueOf(bean.getId()));

5改

  SqliteBean sBean=new SqliteBean(newName,newImg,sqliteBean.getType());
        sqLiteDemoDao.updateData(sBean);

6.查

  if (mType == 0) {
                    datas = sqLiteDemoDao.getDataInList();
                } else {
                    datas = sqLiteDemoDao.getDataInList("type", mType + "");
                }

7小結(jié):這里只是為了做示范做了一個(gè)簡(jiǎn)單的基礎(chǔ)的封裝,十幾的應(yīng)用過(guò)程中要根據(jù)自己的具體項(xiàng)目做更深度的封裝怠苔,基本上基礎(chǔ)的只是有了同廉,其他復(fù)雜的功能無(wú)非就是在基礎(chǔ)的功能上面做的延伸和綜合。

五如果對(duì)于數(shù)據(jù)的操作更為復(fù)雜,或者為了不想自己封裝迫肖,當(dāng)然也可以使用第三方的庫(kù)锅劝,我個(gè)人比較推薦greendao。其實(shí)這里的封裝跟個(gè)人到也有相似之處蟆湖。關(guān)于greendao的操作有很多的優(yōu)秀文章故爵,大家去參考一下吧。

GreenDao

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末隅津,一起剝皮案震驚了整個(gè)濱河市诬垂,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌伦仍,老刑警劉巖结窘,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異充蓝,居然都是意外死亡隧枫,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)谓苟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)官脓,“玉大人,你說(shuō)我怎么就攤上這事涝焙”氨浚” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵纱皆,是天一觀的道長(zhǎng)湾趾。 經(jīng)常有香客問(wèn)我,道長(zhǎng)派草,這世上最難降的妖魔是什么搀缠? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮近迁,結(jié)果婚禮上艺普,老公的妹妹穿的比我還像新娘。我一直安慰自己鉴竭,他們只是感情好歧譬,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著搏存,像睡著了一般瑰步。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上璧眠,一...
    開(kāi)封第一講書(shū)人閱讀 51,590評(píng)論 1 305
  • 那天缩焦,我揣著相機(jī)與錄音读虏,去河邊找鬼。 笑死袁滥,一個(gè)胖子當(dāng)著我的面吹牛盖桥,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播题翻,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼揩徊,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了嵌赠?” 一聲冷哼從身側(cè)響起塑荒,我...
    開(kāi)封第一講書(shū)人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎猾普,沒(méi)想到半個(gè)月后袜炕,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體本谜,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡初家,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了乌助。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片溜在。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖他托,靈堂內(nèi)的尸體忽然破棺而出掖肋,到底是詐尸還是另有隱情,我是刑警寧澤赏参,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布志笼,位于F島的核電站,受9級(jí)特大地震影響把篓,放射性物質(zhì)發(fā)生泄漏纫溃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一韧掩、第九天 我趴在偏房一處隱蔽的房頂上張望紊浩。 院中可真熱鬧,春花似錦疗锐、人聲如沸坊谁。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)口芍。三九已至,卻和暖如春雇卷,著一層夾襖步出監(jiān)牢的瞬間鬓椭,已是汗流浹背虹钮。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留膘融,地道東北人芙粱。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像氧映,于是被迫代替她去往敵國(guó)和親春畔。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355