05. Android基礎(chǔ)——數(shù)據(jù)存儲(chǔ)相關(guān)

  1. Android系統(tǒng)提供了三種方式用于簡(jiǎn)單地實(shí)現(xiàn)數(shù)據(jù)持久化功能
    1. 文件存儲(chǔ)
    2. SharedPreferences存儲(chǔ)
    3. 數(shù)據(jù)庫(kù)存儲(chǔ)

文件存儲(chǔ)

  1. 所有的數(shù)據(jù)都會(huì)原封不動(dòng)的保存到文件當(dāng)中,比較適合存儲(chǔ)簡(jiǎn)單的文本數(shù)據(jù)或二進(jìn)制數(shù)據(jù)

存儲(chǔ)數(shù)據(jù)

  1. Context類(lèi)中有一個(gè)openFileOutput()方法编整,用來(lái)存儲(chǔ)數(shù)據(jù)舅踪,這個(gè)方法接受兩個(gè)參數(shù)

    1. 第一個(gè)參數(shù)是文件名,在文件創(chuàng)建的時(shí)候使用的名字

      • 文件名不包括路徑
      • 所有的文件默認(rèn)都存儲(chǔ)在/data/data/<package name>/files/這個(gè)目錄下
    2. 第二個(gè)參數(shù)是文件的操作模式

      • MODE_PRIVATE
        • 默認(rèn)操作模式
        • 當(dāng)指定同樣的文件名時(shí),新寫(xiě)入的內(nèi)容會(huì)覆蓋原來(lái)的內(nèi)容
      • MODE_APPEND
        • 如果文件存在了,就追加寫(xiě)入內(nèi)容
        • 文件不存在就創(chuàng)建新的文件
    3. 這個(gè)方法返回的是一個(gè)FileOutputStream對(duì)象,可以通過(guò)Java流的方式將數(shù)據(jù)寫(xiě)入到文件中

    4. 例子

      public void save(String inputText){
          FileOutputStream out = null;
          BufferedWriter writer = null;
          try{
              out = openFileOutput("data",Context.MODE_PRIVATE);
              write = new BufferedWriter(new OutputStreamWrite(out));
              write.write(inputText);
          } catch(IOException e){
              e.printStackTrace();
          } finally{
              try{
                  if (writer != null){
                      writer.close()
                  }
              } catch(IOException e){
                  e.printStackTrace();
              }
          }
      }
      

讀取數(shù)據(jù)

  1. 使用openFileInput()方法讀取數(shù)據(jù)拌蜘,這個(gè)方法只接收一個(gè)參數(shù),就是要讀取的文件名

  2. 系統(tǒng)會(huì)自動(dòng)去默認(rèn)的目錄下加載要讀取的文件牙丽,然后返回一個(gè)FIleInputStream對(duì)象简卧,然后再通過(guò)Java流的方式操作

  3. 例子

    public String load(){
        FileInputStream對(duì)象 in = null;
        BufferedReader reader = null;
        StringBuilder content = new StringBuilder();
        try{
            // 獲取一個(gè)FileInputStream對(duì)象
            in = openFileInput("data");
            reader = new BufferedReader(new InputStreamReader(in));
            String line = " ";
            while ((line = reader.readLine()) != null){
                content.append(line);
            } catch (IOException e){
                e.printStackTrace();
            } finally{
                if (reader != null){
                    try{
                        reader.close();
                    }catch(IOException e){
                        e.printStackTrace()
                    }
                }
            }
        }
        
        return content.toString();
    }
    

SharedPreferences存儲(chǔ)

向SharedPreferences存儲(chǔ)數(shù)據(jù)

  1. Context類(lèi)中的getSharedPreferences()方法

    1. 這個(gè)方法接收兩個(gè)參數(shù)
    2. 參數(shù)1:用來(lái)指定SharedPreferences文件的名稱,如果指定的文件不存在就創(chuàng)建一個(gè)(文件都存放在/data/data/<pacakagename>/shared_prefs/目錄下)
    3. 參數(shù)2:用于指定操作模式烤芦,只有一種模式MODE_PRIVATE举娩,也可以直接傳入0
      1. 在Android4.2中被廢棄的模式:MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE
      2. 在Android6.0中被廢棄的模式:MODE_MULTI_PROCESS
  2. Activity類(lèi)中的getSharedPreferences()方法

    1. 和上面的方法相似,但是只接收一個(gè)參數(shù)
    2. 參數(shù):操作模式
    3. 使用這個(gè)方法的時(shí)候會(huì)自動(dòng)將當(dāng)前活動(dòng)的類(lèi)名作為SharedPreferences的文件名
  3. PreferenceManager類(lèi)中的getDefaultSharedPreferences()方法

    1. 靜態(tài)方法,接收一個(gè)Context參數(shù)晓铆,自動(dòng)使用當(dāng)前應(yīng)用程序的包名作為前綴名來(lái)命名SharedPreferences文件
    2. 存儲(chǔ)數(shù)據(jù)分為三步
      • 調(diào)用SharedPreferences對(duì)象的edit()方法來(lái)獲取一個(gè)SharedPreferences.Editor對(duì)象
      • 向SharedPreferences.Editor對(duì)象中添加數(shù)據(jù)
      • 調(diào)用apply()方法將添加的數(shù)據(jù)提交即可
  4. 例子

    public class MainActivity extends AppCompatActivity{
        @Override
        protected void onCreate(Bundle savedInstanceState){
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Button saveData = (Button)findViewById(R.id.save_data);
            saveData.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    SharedPreferences.Editor editor = getSharedPreferences("data",MODE_PRIVATE).edit();
                    editor.putString("name","Tom");
                    editor.putInt("age",28);
                    editor.putBoolean("married",false);
                    editor.apply();
                }
            });
        }
    }
    
    • 通過(guò)getSharedPreferences()方法指定SharedPreferences的文件名叫data

從SharedPreferences讀取數(shù)據(jù)

  1. SharedPreferences對(duì)象中提供了一系列的get方法來(lái)讀取數(shù)據(jù)勺良,get方法對(duì)應(yīng)put方法(putString對(duì)應(yīng)getString)

  2. 這些get方法接收兩個(gè)參數(shù)

    1. 參數(shù)1:鍵,傳入存儲(chǔ)數(shù)據(jù)時(shí)使用的鍵
    2. 參數(shù)2:默認(rèn)值骄噪,當(dāng)傳入的鍵找不到對(duì)應(yīng)的值的時(shí)候以默認(rèn)的值進(jìn)行返回
  3. 例子

    public class MainActivity extends AppCompatActivity{
        @Override
        protected void onCreate(Bundle savedInstanceState){
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            Button readData = (Button) findViewById(R.id.read_data);
            readData.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    SharedPreferences pref = getSharedPreferences("data",MODE_PRIVATE);
                    String name = pref.getString("name","");
                    int age = pref.getInt("age",0);
                    boolean married = pref.getBoolean("married",false);
                    Log.d("MainActivity","name is "+name);
                }
            });
        }
    }
    

SQLite數(shù)據(jù)庫(kù)

創(chuàng)建數(shù)據(jù)庫(kù)

  1. 借助SQLiteOpenHelper類(lèi)來(lái)操作數(shù)據(jù)庫(kù)

  2. SQLiteOpenHelper類(lèi)是一個(gè)抽象類(lèi)尚困,必須自己寫(xiě)一個(gè)類(lèi)來(lái)繼承它,自己寫(xiě)的類(lèi)必須重寫(xiě)其中的onCreate()方法和onUpgrade()方法

  3. SQLiteOpenHelper類(lèi)中的兩個(gè)重要的方法getReadableDatabase()和getWritableDtatabase()

    1. 這兩個(gè)方法都可以創(chuàng)建或打開(kāi)一個(gè)數(shù)據(jù)庫(kù)(數(shù)據(jù)庫(kù)存在就打開(kāi)链蕊,不存在就創(chuàng)建)事甜,返回返回一個(gè)可以對(duì)數(shù)據(jù)庫(kù)進(jìn)行讀寫(xiě)操作的對(duì)象
    2. 當(dāng)數(shù)據(jù)庫(kù)不能寫(xiě)入的時(shí)候,getReadableDatabase()方法返回的對(duì)象只能以只讀的方式打開(kāi)數(shù)據(jù)庫(kù)滔韵,getWritableDtatabase()方法會(huì)出現(xiàn)異常
  4. SQLiteOpenHelper類(lèi)有兩個(gè)構(gòu)造方法逻谦,構(gòu)造方法有四個(gè)參數(shù)

    1. 參數(shù)1:Context,必須有它才能操作數(shù)據(jù)庫(kù)
    2. 參數(shù)2:數(shù)據(jù)庫(kù)名字陪蜻,創(chuàng)建數(shù)據(jù)庫(kù)的時(shí)候使用這個(gè)名字
    3. 參數(shù)3:查詢數(shù)據(jù)的時(shí)候返回一個(gè)自定義的Cursor邦马,可以傳入null
    4. 參數(shù)4:數(shù)據(jù)庫(kù)的版本號(hào)
  5. 數(shù)據(jù)庫(kù)文件存放在/data/data/<package_name>/databases/這個(gè)目錄下

  6. 例子

    1. 創(chuàng)建一個(gè)MyDatabaseHelper類(lèi)繼承SQLiteOpenHelper類(lèi)

      public class MyDatabaseHelper extends SQLiteOpenHelper {
          public static final String CREATE_BOOK = "create table Book("
                  + "id integer primary key autoincrement,"
                  + "author text,"
                  + "price real,"
                  + "pages integer,"
                  + "name text)";
          private Context mContext;
      
          public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
              super(context, name, factory, version);
              mContext = context;
          }
      
          @Override
          public void onCreate(SQLiteDatabase db) {
              db.execSQL(CREATE_BOOK);
              Toast.makeText(mContext, "創(chuàng)建成功", Toast.LENGTH_SHORT).show();
          }
      
          @Override
          public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
      
          }
      }
      
      • 定義一個(gè)類(lèi),然后在類(lèi)中寫(xiě)一個(gè)創(chuàng)建數(shù)據(jù)庫(kù)的語(yǔ)句
      • 重寫(xiě)onCreate()方法宴卖,在這個(gè)方法中調(diào)用剛才寫(xiě)的語(yǔ)句
    2. 然后創(chuàng)建數(shù)據(jù)庫(kù)

      public class MainActivity extends AppCompatActivity{
          private MyDatabaseHelper dbHelper;
          @Override
          protected void onCreate(Bundle savedInstanceState){
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);
      
              dbHelper = new MyDatabaseHelper(this,"BookStore.db",null,1);
              Button createDatabase = (Button) findViewById(R.id.create_database);
              createDatabase.setOnClickListener(new View.OnClickListener() {
                  @Override
                  public void onClick(View view) {
                     dbHelper.getWritableDatabase();
                  }
              });
          }
      }
      

升級(jí)數(shù)據(jù)庫(kù)

  1. 使用onUpgrade()方法來(lái)升級(jí)數(shù)據(jù)庫(kù)

  2. 例子

    public class MyDatabaseHelper extends SQLiteOpenHelper {
        public static final String CREATE_BOOK = "create table Book("
                + "id integer primary key autoincrement,"
                + "author text,"
                + "price real,"
                + "pages integer,"
                + "name text)";
        private Context mContext;
    
        public static final String CREATE_CATEGORY = "create table Category("
                + "id integer primary key autoincrement,"
                +"category name text,"
                +"category code integer)";
    
        public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
            super(context, name, factory, version);
            mContext = context;
        }
    
        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL(CREATE_BOOK);
            db.execSQL(CREATE_CATEGORY);
            Toast.makeText(mContext, "創(chuàng)建成功", Toast.LENGTH_SHORT).show();
        }
    
        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
            
            // 當(dāng)表Book和Category存在的時(shí)候就刪除
            db.execSQL("drop table if exists Book");
            db.execSQL("drop table if exists Category");
            onCreate(db);
        }
    }
    
    
  3. 要執(zhí)行onUpgrade()方法滋将,只需要在SQLiteOpenHelper的構(gòu)造方法中,修改第四個(gè)參數(shù)就可以

    public class MainActivity extends AppCompatActivity{
        private MyDatabaseHelper dbHelper;
        @Override
        protected void onCreate(Bundle savedInstanceState){
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            // 因?yàn)橹暗谒膫€(gè)參數(shù)的值是1症昏,這里只要比1大就行
            dbHelper = new MyDatabaseHelper(this,"BookStore.db",null,2);
            Button createDatabase = (Button) findViewById(R.id.create_database);
            createDatabase.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                   dbHelper.getWritableDatabase();
                }
            });
        }
    }
    

添加數(shù)據(jù)

  1. SQLiteDatabae中提供了一個(gè)insert()方法來(lái)添加數(shù)據(jù)

  2. insert(table_name,null,ContentValues)

    1. 參數(shù)1:表名
    2. 參數(shù)2:在未指定添加數(shù)據(jù)的情況下給某些可以為空的列自動(dòng)賦值NULL随闽,可以直接寫(xiě)null
    3. 參數(shù)3:ContentValues對(duì)象,這個(gè)對(duì)象提供了一系列的put()方法肝谭,將表中每個(gè)列名以及相應(yīng)的待添加數(shù)據(jù)傳入就行了
  3. 例子

    public class MainActivity extends AppCompatActivity{
    
        private MyDatabaseHelper dbHelper;
        @Override
        protected void onCreate(Bundle savedInstanceState){
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            dbHelper = new MyDatabaseHelper(this,"BookStore.db",null,1);
            Button addData = (Button) findViewById(R.id.add_data);
            addData.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    SQLiteDatabase db = dbHelper.getWritableDatabase();
                    ContentValues values = new ContentValues();
    
                    // 下面的代碼用來(lái)組裝一條要插入數(shù)據(jù)庫(kù)中的數(shù)據(jù)
                    values.put("name","A Book");  // put()第一個(gè)參數(shù)是表中的列名,第二個(gè)是要插入的值
                    values.put("author","Jone Doe");
                    values.put("pages",444);
                    values.put("price",55.45);
    
                    // 將組裝好的數(shù)據(jù)插入到數(shù)據(jù)庫(kù)中
                    db.insert("Book",null,values);
                    values.clear();
                }
            });
        }
    }
    

更新數(shù)據(jù)

  1. SQLiteDatabae中提供了一個(gè)update()方法來(lái)添加數(shù)據(jù)

  2. update(table_name,ContentValues,args,args)

    1. 參數(shù)1:表名
    2. 參數(shù)2:ContentValues對(duì)象攘烛,更新的數(shù)據(jù)在這里完成組裝
    3. 參數(shù)3和4用于約束更新的范圍魏滚,是哪一行還是哪幾行,不指定就默認(rèn)更新所有行
  3. 例子

    public class MainActivity extends AppCompatActivity{
    
        private MyDatabaseHelper dbHelper;
        @Override
        protected void onCreate(Bundle savedInstanceState){
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            dbHelper = new MyDatabaseHelper(this,"BookStore.db",null,1);
            Button updateData = (Button) findViewById(R.id.update_data);
            updateData.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    SQLiteDatabase db = dbHelper.getWritableDatabase();
                    ContentValues values = new ContentValues();
                    
                    values.put("price",56.78);
                    
                    // 參數(shù)3相當(dāng)于SQL語(yǔ)句中的where部分
                    // 這里表示更新所有name等于?的行医寿,?在這里表示占位符栏赴,具體的值通過(guò)參數(shù)4提供
                    // 參數(shù)4提供了一個(gè)字符串?dāng)?shù)據(jù)蘑斧,來(lái)給參數(shù)3中的占位符指定相應(yīng)的內(nèi)容
                    db.update("Book",values,"name=?",new String[]{"A Book"});
                }
            });
        }
    }
    

刪除數(shù)據(jù)

  1. SQLiteDatabae中提供了一個(gè)delete()方法來(lái)添加數(shù)據(jù)

  2. delete(table_name,args,args)

    1. 參數(shù)1:表名
    2. 參數(shù)2和參數(shù)3:用于約束刪除哪一行或者哪幾行的數(shù)據(jù)靖秩,不指定就默認(rèn)刪除所有行
  3. 例子

    public class MainActivity extends AppCompatActivity{
    
        private MyDatabaseHelper dbHelper;
        @Override
        protected void onCreate(Bundle savedInstanceState){
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            dbHelper = new MyDatabaseHelper(this,"BookStore.db",null,1);
            Button deleteButton = (Button) findViewById(R.id.delete_data);
            deleteButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    SQLiteDatabase db = dbHelper.getWritableDatabase();
                    
                    // 這里表示刪除頁(yè)數(shù)超過(guò)300的數(shù)據(jù)
                    db.delete("Book","pages > ?",new String[]{"300"});
                }
            });
        }
    }
    

查詢數(shù)據(jù)

  1. SQLiteDatabae中提供了一個(gè)query()方法來(lái)添加數(shù)據(jù)

  2. 調(diào)用query()方法之后會(huì)返回一個(gè)Cursor對(duì)象,查詢到的數(shù)據(jù)都從這個(gè)對(duì)象中取出

  3. query()方法有7個(gè)參數(shù)

    1. 參數(shù)1:表名
    2. 參數(shù)2:指定去查詢哪幾列竖瘾,不指定就默認(rèn)查詢所有列
    3. 參數(shù)3沟突,參數(shù)4:用于約束查詢某一行或某幾行的數(shù)據(jù),不指定就默認(rèn)查詢所有行的數(shù)據(jù)
    4. 參數(shù)5:用于指定需要去group by的列捕传,不指定就表示不對(duì)查詢結(jié)果進(jìn)行g(shù)roup by的操作
    5. 參數(shù)6:用于對(duì)group by之后的數(shù)據(jù)進(jìn)行進(jìn)一步過(guò)濾惠拭,不指定就不進(jìn)行過(guò)濾
    6. 參數(shù)7:指定查詢結(jié)果的排序方式,不指定就表示使用默認(rèn)的排序方式
  4. 例子

    public class MainActivity extends AppCompatActivity{
    
        private MyDatabaseHelper dbHelper;
        @Override
        protected void onCreate(Bundle savedInstanceState){
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            dbHelper = new MyDatabaseHelper(this,"BookStore.db",null,1);
            Button queryButton = (Button) findViewById(R.id.retrieve_data);
            queryButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    SQLiteDatabase db = dbHelper.getWritableDatabase();
    
                    // 查詢表中所有的數(shù)據(jù)
                    Cursor cursor = db.query("book",null,null,null,null,null,null);
                    if (cursor.moveToFirst()){
                        do {
                            String name = cursor.getString(cursor.getColumnIndex("name"));
                            String author = cursor.getString(cursor.getColumnIndex("author"));
                        }while (cursor.moveToNext());
                    }
                    cursor.close();
                }
            });
        }
    }
    
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市职辅,隨后出現(xiàn)的幾起案子棒呛,更是在濱河造成了極大的恐慌,老刑警劉巖域携,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件簇秒,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡秀鞭,警方通過(guò)查閱死者的電腦和手機(jī)趋观,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)锋边,“玉大人皱坛,你說(shuō)我怎么就攤上這事《咕蓿” “怎么了剩辟?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)往扔。 經(jīng)常有香客問(wèn)我抹沪,道長(zhǎng),這世上最難降的妖魔是什么瓤球? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任融欧,我火速辦了婚禮,結(jié)果婚禮上卦羡,老公的妹妹穿的比我還像新娘噪馏。我一直安慰自己,他們只是感情好绿饵,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布欠肾。 她就那樣靜靜地躺著,像睡著了一般拟赊。 火紅的嫁衣襯著肌膚如雪刺桃。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,541評(píng)論 1 305
  • 那天吸祟,我揣著相機(jī)與錄音瑟慈,去河邊找鬼。 笑死屋匕,一個(gè)胖子當(dāng)著我的面吹牛葛碧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播过吻,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼进泼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起乳绕,我...
    開(kāi)封第一講書(shū)人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤绞惦,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后洋措,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體翩隧,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年呻纹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了堆生。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡雷酪,死狀恐怖淑仆,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情哥力,我是刑警寧澤蔗怠,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站吩跋,受9級(jí)特大地震影響寞射,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜锌钮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一桥温、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧梁丘,春花似錦侵浸、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至值漫,卻和暖如春澳腹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背杨何。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工酱塔, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人晚吞。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓延旧,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親槽地。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

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