iOS開發(fā)-iCloud的簡(jiǎn)單使用(3)-Cloud Kit的使用

好了者填,看完了key-value,看完了Document的存儲(chǔ)露戒,終于到了Cloud kit的使用了。

比起前邊的兩種捶箱,Cloud kit更像是一個(gè)數(shù)據(jù)庫(kù)智什。蘋果會(huì)提供一個(gè)dashboard作為云存儲(chǔ)的管理端。

Cloud Kit 基礎(chǔ)

cloud kit一共有7個(gè)基礎(chǔ)類丁屎,簡(jiǎn)單了解一下這些基礎(chǔ)類接下來的使用就比較容易理解了荠锭。

CKContainer

CKContainer類似于應(yīng)用運(yùn)行時(shí)的沙盒,一個(gè)應(yīng)用只能訪問自己的沙盒晨川,同樣的证九,一個(gè)應(yīng)用也只能訪問自己的Container删豺。

通過初始化之后就可以使用


 CKContainer *container = [CKContainer defaultContainer];

CKDatabase

CKDatabase很明顯就是數(shù)據(jù)庫(kù),他擁有私有數(shù)據(jù)庫(kù)公有數(shù)據(jù)庫(kù)兩種類型愧怜。用戶只能訪問自己的私有數(shù)據(jù)庫(kù)呀页,一些不敏感的數(shù)據(jù)也可以存儲(chǔ)在公有數(shù)據(jù)庫(kù)中。


 //公有數(shù)據(jù)庫(kù)

 CKDatabase *datebase = container.publicCloudDatabase;

 //私有數(shù)據(jù)庫(kù)

 CKDatabase *datebase = container.privateCloudDatabase;

CKRecord

CKRecord就是數(shù)據(jù)庫(kù)中的一條數(shù)據(jù)記錄拥坛,他通過key-value的方式來存儲(chǔ)和獲取數(shù)據(jù)蓬蝶。目前可以支持如下格式的數(shù)據(jù):

  • NSString(swift中的Sting)

  • NSNumber

  • NSData

  • NSDate

  • CLLocation

  • CKReference

  • CKAsset

其中圖片的數(shù)據(jù)類型需要先初始化一個(gè)URL,然后把圖片保存到本地沙盒猜惋,生成URL丸氛,再創(chuàng)建CKAsset來存儲(chǔ)。

CKRecordZone

CKRecordZone是用來保存Record的著摔。所有的Record都是保存在這里缓窜,應(yīng)用有一個(gè)默認(rèn)的zone,也可以自定義zone梨撞。

CKRecordIdentifier

CKRecordIdentifierRecord的唯一標(biāo)示雹洗,用來確定Record在數(shù)據(jù)庫(kù)中的位置。

CKReference

CKReference是一種引用關(guān)系卧波。

CKAsset

CKAsset 為資源文件,比如之前提到的照片就是用這種方式存儲(chǔ)的庇茫。

CloudKit Dashboard

更新:

這里還有一個(gè)WWDC的視頻介紹Cloud dashboard

Build Better Apps with CloudKit Dashboard]

CloudKit Dashboard 的入口在這里:

CloudKitDashboardEnter.png

你也可以直接訪問地址港粱。

這個(gè)界面好像更新過了,和網(wǎng)上很多教程的樣式都不太一樣旦签。新的界面長(zhǎng)這樣:

CloudKitDashboardWeb.png

新的界面包括開發(fā)版和產(chǎn)品版(線上版)兩種查坪,在開發(fā)的時(shí)候我們就只針對(duì)左邊的開發(fā)版進(jìn)行操作就可以了。無論是那個(gè)版本宁炫,都有五個(gè)相同的入口偿曙。

Data

Cloud kit的數(shù)據(jù)管理中心入口。在這里可以進(jìn)行數(shù)據(jù)的字段羔巢,索引等內(nèi)容設(shè)定望忆。

Logs

查看Cloud kit的服務(wù)日志,顯示數(shù)據(jù)庫(kù)操作竿秆,推送通知以及對(duì)應(yīng)環(huán)境中的其他活動(dòng)启摄。

Telemetry

查看對(duì)應(yīng)環(huán)境中服務(wù)器端性能和數(shù)據(jù)庫(kù)利用率的圖表。

Public Database Usage

查看公共數(shù)據(jù)庫(kù)的使用情況圖標(biāo)幽钢,包括活躍用戶歉备、請(qǐng)求頻率等。

Api Access

管理API令牌和服務(wù)器密鑰匪燕,允許對(duì)應(yīng)環(huán)境進(jìn)行web服務(wù)調(diào)用蕾羊。

使用

這次我們只講簡(jiǎn)單的操作喧笔,所以本篇文章就只使用 Data中的部分功能。

創(chuàng)建 RECORD TYPE

首先點(diǎn)擊Data , RECORD TYPE , Create New Type創(chuàng)建一個(gè)新的RECORD TYPE龟再。

CloudKitCreateRecordType.png

這里注意书闸,我們的RECORD TYPE Name 是Note,這個(gè)在之后代碼里操作非常重要吸申,所以記得不要寫錯(cuò)了梗劫。

添加 Field

有了表,接下來就是添加字段了截碴。點(diǎn)擊Add Field 然后輸入字段名梳侨,選擇類型就可以了。這里可以一次性添加多條日丹,添加完點(diǎn)擊保存就可以了走哺。

CloudKitAddField.png

添加的內(nèi)容有:

  • title String

  • content String

  • photo Asset

添加 indexs

為了搜索更方便一些,我們添加一些索引哲虾。

點(diǎn)擊INDEXS丙躏,選擇我們剛剛添加的Note,然后添加索引束凑,添加的索引類型有QUERYABLE,SEARCHABLE,SORTABLE晒旅。

CloudKitAddIndex.png

添加的內(nèi)容有:

  • title QUERYABLE

  • title SEARCHABLE

  • title SORTABLE

  • content QUERYABLE

  • content SEARCHABLE

  • content SORTABLE

  • recordName QUERYABLE

添加完就是這樣的,對(duì)照一下看看有沒有添加錯(cuò)啊汪诉。

CloudKitAddIndexFinished.png

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

接下來废恋,我們就可以給表里添加數(shù)據(jù)了。

選擇RECORD ,確認(rèn)LOAD RECORDS FROMQUERY FOR RECORDS OF TYPE 都正確了之后扒寄,點(diǎn)擊Creat New Record...鱼鼓,在右邊輸入想要插入的數(shù)據(jù),添加個(gè)幾條就可以了该编。

CloudKitAddRecord.png

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

隨便添加幾條數(shù)據(jù)之后迄本,還是在這個(gè)頁(yè)面,點(diǎn)擊左側(cè)的Query Records课竣,就可以查詢到數(shù)據(jù)了嘉赎。

CloudKitQueryRecords.png

到此,Cloud Dashboard的簡(jiǎn)單使用就介紹到這稠氮,接下來我們看看通過代碼怎么來操作Cloud kit曹阔。

擼起袖子寫代碼吧。

通過代碼操作 Cloud Kit

使用Cloud Kit時(shí)隔披,首先要先引入Cloud kit的框架赃份。


#import <CloudKit/CloudKit.h>

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

首先創(chuàng)建一個(gè)容器


 //獲取容器

 CKContainer *container = [CKContainer defaultContainer];

然后獲取數(shù)據(jù)庫(kù),這里我們使用公有數(shù)據(jù)庫(kù)


 //公共數(shù)據(jù)

 CKDatabase *datebase = container.publicCloudDatabase;

接下來創(chuàng)建一條數(shù)據(jù),這里的RECORD_TYPE_NAME就是之前創(chuàng)建表的名字Note


 //創(chuàng)建保存數(shù)據(jù)

 CKRecord *noteRecord = [[CKRecord alloc] initWithRecordType:RECORD_TYPE_NAME];

添加數(shù)據(jù)是使用Key-value的方式抓韩。


 [noteRecord setValue:title forKey:@"title"];

 [noteRecord setValue:content forKey:@"content"];

這里要特殊注意的是圖片的處理纠永,我們先要?jiǎng)?chuàng)建一個(gè)URL,然后把圖片數(shù)據(jù)保存到沙盒中谒拴,生成一個(gè)URL尝江,再創(chuàng)建CKAsset。


 NSDate *dateID = [NSDate dateWithTimeIntervalSinceNow:0];

 NSTimeInterval timeInterval = [dateID timeIntervalSince1970] * 1000; //*1000表示到毫秒級(jí)英上,這樣可以保證不會(huì)同時(shí)生成兩個(gè)同樣的id

 NSString *idString = [NSString stringWithFormat:@"%.0f", timeInterval];

 NSString *filePath = [NSString stringWithFormat:@"%@/%@",tempPath,idString];

 NSURL *url = [NSURL fileURLWithPath:filePath];

 [imageData writeToURL:url atomically:YES];

 CKAsset *asset = [[CKAsset alloc]initWithFileURL:url];

 [noteRecord setValue:asset forKey:@"photo"];

對(duì)了炭序,還有CKAsset轉(zhuǎn)UIImage的方法:


CKAsset *asset = [record objectForKey:@"photo"];

UIImage *image = [UIImage imageWithContentsOfFile:asset.fileURL.path];

這樣數(shù)據(jù)的內(nèi)容就處理好了,接下來我們只要把它保存起來就可以咯苍日。


 [datebase saveRecord:noteRecord completionHandler:^(CKRecord * _Nullable record, NSError * _Nullable error) {

 if(!error)

 {

 NSLog(@"保存成功");

 }

 else

 {

 NSLog(@"保存失敗");

 NSLog(@"%@",error.description);

 }

 }];

整個(gè)代碼合起來就是這樣的:


+ (void)saveCloudKitModelWithTitle:(NSString *)title content:(NSString *)content photoImage:(UIImage *)image

{

 //獲取容器

 CKContainer *container = [CKContainer defaultContainer];

 //公共數(shù)據(jù)

 CKDatabase *datebase = container.publicCloudDatabase;

// //私有數(shù)據(jù)

// CKDatabase *datebase = container.privateCloudDatabase;

// //創(chuàng)建主鍵

// CKRecordID *noteID = [[CKRecordID alloc] initWithRecordName:@"NoteID"];

 //創(chuàng)建保存數(shù)據(jù)

 CKRecord *noteRecord = [[CKRecord alloc] initWithRecordType:RECORD_TYPE_NAME];

 NSData *imageData = UIImagePNGRepresentation(image);

 if (imageData == nil)

 {

 imageData = UIImageJPEGRepresentation(image, 0.6);

 }

 NSString *tempPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/imagesTemp"];

 NSFileManager *manager = [NSFileManager defaultManager];

 if (![manager fileExistsAtPath:tempPath]) {

 [manager createDirectoryAtPath:tempPath withIntermediateDirectories:YES attributes:nil error:nil];

 }

 NSDate *dateID = [NSDate dateWithTimeIntervalSinceNow:0];

 NSTimeInterval timeInterval = [dateID timeIntervalSince1970] * 1000; //*1000表示到毫秒級(jí)惭聂,這樣可以保證不會(huì)同時(shí)生成兩個(gè)同樣的id

 NSString *idString = [NSString stringWithFormat:@"%.0f", timeInterval];

 NSString *filePath = [NSString stringWithFormat:@"%@/%@",tempPath,idString];

 NSURL *url = [NSURL fileURLWithPath:filePath];

 [imageData writeToURL:url atomically:YES];

 CKAsset *asset = [[CKAsset alloc]initWithFileURL:url];

 [noteRecord setValue:title forKey:@"title"];

 [noteRecord setValue:content forKey:@"content"];

 [noteRecord setValue:asset forKey:@"photo"];

 [datebase saveRecord:noteRecord completionHandler:^(CKRecord * _Nullable record, NSError * _Nullable error) {

 if(!error)

 {

 NSLog(@"保存成功");

 }

 else

 {

 NSLog(@"保存失敗");

 NSLog(@"%@",error.description);

 }

 }];

}

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

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

查詢數(shù)據(jù)同樣,我們也要先獲取容器和數(shù)據(jù)庫(kù)相恃。


 //獲取位置

 CKContainer *container = [CKContainer defaultContainer];

 CKDatabase *database = container.publicCloudDatabase;

之后我們添加一個(gè)查詢的條件辜纲,cloud kit和core data一樣,都是使用NSPredicate拦耐。

而且還要用到CKQuery這個(gè)類耕腾。


 //添加查詢條件

 NSPredicate *predicate = [NSPredicate predicateWithValue:YES];

 CKQuery *query = [[CKQuery alloc] initWithRecordType:RECORD_TYPE_NAME predicate:predicate];

準(zhǔn)備好了,接下來就可以調(diào)用查詢方法了杀糯,獲取到的results就是獲取到數(shù)據(jù)的數(shù)組了扫俺,這里我用了通知的方法把查詢到的數(shù)據(jù)傳出去。


 //開始查詢

 [database performQuery:query inZoneWithID:nil completionHandler:^(NSArray<CKRecord *> * _Nullable results, NSError * _Nullable error) {

 NSLog(@"%@",results);

 //把數(shù)據(jù)做成字典通知出去

 NSDictionary *userinfoDic = [NSDictionary dictionaryWithObject:results forKey:@"key"];

 [[NSNotificationCenter defaultCenter] postNotificationName:@"CloudDataQueryFinished" object:nil userInfo:userinfoDic];

 }];

整個(gè)代碼合起來就是這樣的:


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

+ (void)queryCloudKitData

{

 //獲取位置

 CKContainer *container = [CKContainer defaultContainer];

 CKDatabase *database = container.publicCloudDatabase;

 //添加查詢條件

 NSPredicate *predicate = [NSPredicate predicateWithValue:YES];

 CKQuery *query = [[CKQuery alloc] initWithRecordType:RECORD_TYPE_NAME predicate:predicate];

 //開始查詢

 [database performQuery:query inZoneWithID:nil completionHandler:^(NSArray<CKRecord *> * _Nullable results, NSError * _Nullable error) {

 NSLog(@"%@",results);

 //把數(shù)據(jù)做成字典通知出去

 NSDictionary *userinfoDic = [NSDictionary dictionaryWithObject:results forKey:@"key"];

 [[NSNotificationCenter defaultCenter] postNotificationName:@"CloudDataQueryFinished" object:nil userInfo:userinfoDic];

 }];

}

查詢單個(gè)數(shù)據(jù)

同樣也是獲取容器和數(shù)據(jù)庫(kù)固翰。


 //獲取位置

 CKContainer *container = [CKContainer defaultContainer];

 CKDatabase *database = container.publicCloudDatabase;

然后我們需要獲取查詢的數(shù)據(jù)的RecordID牵舵。


 [database fetchRecordWithID:recordID completionHandler:^(CKRecord * _Nullable record, NSError * _Nullable error) {

 dispatch_async(dispatch_get_main_queue(), ^{

 NSLog(@"%@",record);

 //把數(shù)據(jù)做成字典通知出去

 NSDictionary *userinfoDic = [NSDictionary dictionaryWithObject:record forKey:@"key"];

 [[NSNotificationCenter defaultCenter] postNotificationName:@"CloudDataSingleQueryFinished" object:nil userInfo:userinfoDic];

 });

 }];

合起來代碼就是這樣的:


//查詢單條數(shù)據(jù)

+ (void)querySingleRecordWithRecordID:(CKRecordID *)recordID

{

 //獲取容器

 CKContainer *container = [CKContainer defaultContainer];

 //獲取公有數(shù)據(jù)庫(kù)

 CKDatabase *database = container.publicCloudDatabase;

 [database fetchRecordWithID:recordID completionHandler:^(CKRecord * _Nullable record, NSError * _Nullable error) {

 dispatch_async(dispatch_get_main_queue(), ^{

 NSLog(@"%@",record);

 //把數(shù)據(jù)做成字典通知出去

 NSDictionary *userinfoDic = [NSDictionary dictionaryWithObject:record forKey:@"key"];

 [[NSNotificationCenter defaultCenter] postNotificationName:@"CloudDataSingleQueryFinished" object:nil userInfo:userinfoDic];

 });

 }];

}

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

刪除數(shù)據(jù)同樣,我們也要先獲取容器和數(shù)據(jù)庫(kù)倦挂。


 //獲取位置

 CKContainer *container = [CKContainer defaultContainer];

 CKDatabase *database = container.publicCloudDatabase;

然后,在刪除數(shù)據(jù)時(shí)担巩,要獲取到你要?jiǎng)h除的數(shù)據(jù)的RecordID方援,之后直接執(zhí)行刪除方法即可


 [database deleteRecordWithID:recordID completionHandler:^(CKRecordID * _Nullable recordID, NSError * _Nullable error) {

 if(error)

 {

 NSLog(@"刪除失敗");

 }

 else

 {

 NSLog(@"刪除成功");

 }

 }];

合起來代碼就是這樣


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

+ (void)removeCloudKitDataWithRecordID:(CKRecordID *)recordID

{

 CKContainer *container = [CKContainer defaultContainer];

 CKDatabase *database = container.publicCloudDatabase;

 [database deleteRecordWithID:recordID completionHandler:^(CKRecordID * _Nullable recordID, NSError * _Nullable error) {

 if(error)

 {

 NSLog(@"刪除失敗");

 }

 else

 {

 NSLog(@"刪除成功");

 }

 }];

}

修改數(shù)據(jù)

還是那句話,先獲取容器


 CKContainer *container = [CKContainer defaultContainer];

 CKDatabase *database = container.publicCloudDatabase;

其實(shí)修改數(shù)據(jù)就是重新把數(shù)據(jù)寫入涛癌。在寫入的時(shí)候如果選擇之前沒有的key犯戏,就相當(dāng)于新增了一個(gè)字段。然后執(zhí)行保存操作就可以了拳话。

直接上全部的代碼好了:


//修改數(shù)據(jù)

+ (void)changeCloudKitWithTitle:(NSString *)title content:(NSString *)content photoImage:(UIImage *)image RecordID:(CKRecordID *)recordID

{

 //獲取容器

 CKContainer *container = [CKContainer defaultContainer];

 //獲取公有數(shù)據(jù)庫(kù)

 CKDatabase *database = container.publicCloudDatabase;

 [database fetchRecordWithID:recordID completionHandler:^(CKRecord * _Nullable record, NSError * _Nullable error) {

 NSData *imageData = UIImagePNGRepresentation(image);

 if (imageData == nil)

 {

 imageData = UIImageJPEGRepresentation(image, 0.6);

 }

 NSString *tempPath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/imagesTemp"];

 NSFileManager *manager = [NSFileManager defaultManager];

 if (![manager fileExistsAtPath:tempPath]) {

 [manager createDirectoryAtPath:tempPath withIntermediateDirectories:YES attributes:nil error:nil];

 }

 NSDate *dateID = [NSDate dateWithTimeIntervalSinceNow:0];

 NSTimeInterval timeInterval = [dateID timeIntervalSince1970] * 1000; //*1000表示到毫秒級(jí)先匪,這樣可以保證不會(huì)同時(shí)生成兩個(gè)同樣的id

 NSString *idString = [NSString stringWithFormat:@"%.0f", timeInterval];

 NSString *filePath = [NSString stringWithFormat:@"%@/%@",tempPath,idString];

 NSURL *url = [NSURL fileURLWithPath:filePath];

 [imageData writeToURL:url atomically:YES];

 CKAsset *asset = [[CKAsset alloc]initWithFileURL:url];

 [record setObject:title forKey:@"title"];

 [record setObject:content forKey:@"content"];

 [record setValue:asset forKey:@"photo"];

 [database saveRecord:record completionHandler:^(CKRecord * _Nullable record, NSError * _Nullable error) {

 if(error)

 {

 NSLog(@"修改失敗 %@",error.description);

 }

 else

 {

 NSLog(@"修改成功");

 }

 }];

 }];

}

Demo

先放一下demo的地址

demo簡(jiǎn)單的制作了一個(gè)簡(jiǎn)單的cloud kit存儲(chǔ)功能弃衍,一些交互沒有完善呀非,但是基本的增刪改查功能都已經(jīng)實(shí)現(xiàn)了。

CloudKitDemo.gif

以上就是Cloud Kit的簡(jiǎn)單使用。此文章僅供個(gè)人學(xué)習(xí)使用岸裙,如有不當(dāng)猖败,希望大佬指出。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末降允,一起剝皮案震驚了整個(gè)濱河市恩闻,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌剧董,老刑警劉巖幢尚,帶你破解...
    沈念sama閱讀 211,743評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異翅楼,居然都是意外死亡尉剩,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門犁嗅,熙熙樓的掌柜王于貴愁眉苦臉地迎上來边涕,“玉大人,你說我怎么就攤上這事褂微」︱眩” “怎么了?”我有些...
    開封第一講書人閱讀 157,285評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵宠蚂,是天一觀的道長(zhǎng)式撼。 經(jīng)常有香客問我,道長(zhǎng)求厕,這世上最難降的妖魔是什么著隆? 我笑而不...
    開封第一講書人閱讀 56,485評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮呀癣,結(jié)果婚禮上美浦,老公的妹妹穿的比我還像新娘。我一直安慰自己项栏,他們只是感情好浦辨,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,581評(píng)論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著沼沈,像睡著了一般流酬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上列另,一...
    開封第一講書人閱讀 49,821評(píng)論 1 290
  • 那天芽腾,我揣著相機(jī)與錄音,去河邊找鬼页衙。 笑死摊滔,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播惭载,決...
    沈念sama閱讀 38,960評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼旱函,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了描滔?” 一聲冷哼從身側(cè)響起棒妨,我...
    開封第一講書人閱讀 37,719評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎含长,沒想到半個(gè)月后券腔,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,186評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡拘泞,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,516評(píng)論 2 327
  • 正文 我和宋清朗相戀三年纷纫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片陪腌。...
    茶點(diǎn)故事閱讀 38,650評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡辱魁,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出诗鸭,到底是詐尸還是另有隱情染簇,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評(píng)論 4 330
  • 正文 年R本政府宣布强岸,位于F島的核電站锻弓,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏蝌箍。R本人自食惡果不足惜青灼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,936評(píng)論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望妓盲。 院中可真熱鬧杂拨,春花似錦、人聲如沸悯衬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)甚亭。三九已至,卻和暖如春击胜,著一層夾襖步出監(jiān)牢的瞬間亏狰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工偶摔, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留暇唾,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,370評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像策州,于是被迫代替她去往敵國(guó)和親瘸味。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,527評(píng)論 2 349

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