嫩草影院久久99_老司机午夜网站国内精品久久久久久久久_久久夜色精品国产_国产一级做a爰片久久毛片

每天學(xué)習(xí)一個Android中的常用框架——1.Litepal

2020-4-8    seo達(dá)人

文章目錄

1.簡介

2.特性

3.演示

3.1 集成

3.2 配置

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

3.4 升級數(shù)據(jù)庫

3.5 插入數(shù)據(jù)

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

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

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

4.版本異同

5.源碼地址

1.簡介

Litepal——作為帶我入行的第一本教學(xué)書籍《Android第一行代碼》的作者郭霖老師所寫出來的持久化框架,幾乎算是我接觸Android世界之后第一個遇到的框架,故將該框架列為一系列學(xué)習(xí)框架博客的首位。

根據(jù)Litepal的GitHub主頁:Litepal,可以看到該框架的一些簡介:



LitePal is an open source Android library that allows developers to use SQLite database extremely easy. You can finish most of the database operations without writing even a SQL statement, including create or upgrade tables, crud operations, aggregate functions, etc. The setup of LitePal is quite simple as well, you can integrate it into your project in less than 5 minutes.



事實上,正如這段簡介所說,集成Litepal相當(dāng)簡單,不需要超過五分鐘時間。使用Litepal,也適合對sql語言還不熟悉的開發(fā)者快速上手。



2.特性

讓我們繼續(xù)瀏覽Litepal的GitHub主頁,可以發(fā)掘Litepal的一些特性:



Using object-relational mapping (ORM) pattern.

Almost zero-configuration(only one configuration file with few properties).

Maintains all tables automatically(e.g. create, alter or drop tables).

Multi databases supported.

Encapsulated APIs for avoiding writing SQL statements.

Awesome fluent query API.

Alternative choice to use SQL still, but easier and better APIs than the originals.

More for you to explore.

用大白話來描述的話,可以列舉如下:



Litepal使用了ORM(對象關(guān)系映射)模型

Litepal幾乎是無配置的,僅需極少的配置文件

Litepal幾乎包括所有的CRUD操作,也支持多張表格的操作

Litepal可以僅調(diào)用api進(jìn)行CRUD操作而避免編寫sql語句

總之,看到Litepal具有這么多良好的特性,讀者是否心動了呢。理論的話不多說,我們現(xiàn)在就開始正式地使用Litepal進(jìn)行數(shù)據(jù)庫的相關(guān)操作

PS:如果有曾經(jīng)學(xué)習(xí)過Java的ORM框架——Mybatis的讀者,應(yīng)該不會對Litepal的使用太陌生,因為它們都使用了xml文件進(jìn)行相應(yīng)的配置



3.演示

3.1 集成

現(xiàn)在Android框架的集成相比于IDE還為ADT的時代,要方便了許多。原因是現(xiàn)在的主流IDE是Android Studio,而AS默認(rèn)使用了Gradle進(jìn)行版本的配置管理,這讓集成框架變得簡單了許多。

在build.gradle下,添加以下語句,然后重新sync,即可將Litepal集成到你的項目中:



implementation 'org.litepal.android:java:3.0.0'

1

當(dāng)然,目前Android的主流開發(fā)語言,除了Java之外,還有Kotlin,Litepal同樣具有Kotlin版本的(這里的演示僅針對Java,Kotlin版本的異曲同工)依賴:



implementation 'org.litepal.android:kotlin:3.0.0'

1

可以根據(jù)個人需求進(jìn)行配置。



3.2 配置

集成了Litepal之后,要想正式使用它還需要進(jìn)行一些配置



在assets目錄下新建litepal.xml,作為Litepal的全局配置文件,相應(yīng)的條目信息已作出注釋,代碼如下:

<?xml version="1.0" encoding="utf-8"?>

<litepal>

    <!--  數(shù)據(jù)庫名  -->

    <dbname value="androidframelearn"/>



    <!--  數(shù)據(jù)庫版本號  -->

    <version value="1"/>



    <!--  指定映射模型  -->

    <list>

       

    </list>



    <!--  指定文件的存儲方式  -->

    <!--  <storage value="external" />-->

</litepal>



在你的應(yīng)用下配置Litepal,有兩種方式可以實現(xiàn):

修改清單文件,將你的應(yīng)用名修改為:android:name="org.litepal.LitePalApplication"

新建一個自己寫的MyOwnApplication類,然后將清單文件中的應(yīng)用名定位到該類,即:android:name="com.example.MyOwnApplication",然后再編寫MyOwnApplication類,代碼如下:

public class MyOwnApplication extends Application {



@Override

public void onCreate() {

    super.onCreate();

    LitePal.initialize(this);

}

...

}



兩種方式亦可,Litepal的作者建議若使用第二種方式,需要盡快地調(diào)用LitePal.initialize(this);所以將其放在onCreate()方法是最好的。



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

剛才在介紹的時候已經(jīng)說過,Litepal采取的是對象關(guān)系映射(ORM)的模式,那么什么是對象關(guān)系映射呢?簡單點說,我們使用的編程語言是面向?qū)ο笳Z言,而使用的數(shù)據(jù)庫則是關(guān)系型數(shù)據(jù)庫,那么將面向?qū)ο蟮恼Z言和面向關(guān)系的數(shù)據(jù)庫之間建立一種映射關(guān)系,這就是對象關(guān)系映射了。

不過你可千萬不要小看對象關(guān)系映射模式,它賦予了我們一個強(qiáng)大的功能,就是可以用面向?qū)ο蟮乃季S來操作數(shù)據(jù)庫,而不用再和SQL語句打交道了,不信的話我們現(xiàn)在就來體驗一下。像往常使用SQLiteOpenHelper類,為了創(chuàng)建一張Book表需要先分析表中應(yīng)該包含哪些列,然后再編寫出一條建表語句,最后在自定義的SQLiteOpenHelper中去執(zhí)行這條建表語句。但是使用LitePal,你就可以用面向?qū)ο蟮乃季S來實現(xiàn)同樣的功能了,定義一個Book類,代碼如下所示:



package com.androidframelearn.dao_litapal;



import org.litepal.crud.LitePalSupport;



public class Book extends LitePalSupport {

    private int id;

    private String author;

    private double price;

    private int pages;

    private String name;

    public int getId(){

        return id;

    }

    public void setId(int id){

        this.id = id;

    }



    public String getAuthor(){

        return author;

    }

    public void setauthor(String author){

        this.author = author;

    }



    public double getPrice(){

        return price;

    }

    public void setPrice(double price){

        this.price = price;

    }



    public int getPages(){

        return pages;

    }

    public void setPages(int pages){

        this.pages = pages;

    }



    public String getName(){

        return name;

    }

    public void setName(String name){

        this.name = name;

    }

}



這里使用標(biāo)簽來聲明我們要配置的映射模型類,注意一定要使用完整的類名。不管有多少模型類需要映射,都使用同樣的方式配置在標(biāo)簽下即可。

沒錯,這樣就已經(jīng)把所有工作都完成了,現(xiàn)在只要進(jìn)行任意一次數(shù)據(jù)庫的操作,BookStore.db數(shù)據(jù)庫應(yīng)該就會自動創(chuàng)建出來。為了更好地演示代碼,我們將布局文件所需要的功能一次性編寫好,activity_main.xml代碼如下:



<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

    xmlns:tools="http://schemas.android.com/tools"

    android:layout_width="match_parent"

    android:layout_height="match_parent"

    tools:context=".MainActivity"

    android:orientation="vertical">



    <Button

        android:id="@+id/btn_db_create"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:text="創(chuàng)建數(shù)據(jù)庫"/>



    <Button

        android:id="@+id/btn_db_query"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:text="查詢數(shù)據(jù)"/>



    <Button

        android:id="@+id/btn_db_insert"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:text="插入數(shù)據(jù)"/>



    <Button

        android:id="@+id/btn_db_update"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:text="更新數(shù)據(jù)"/>



    <Button

        android:id="@+id/btn_db_delete"

        android:layout_width="match_parent"

        android:layout_height="wrap_content"

        android:text="刪除數(shù)據(jù)"/>



</LinearLayout>





接下來,修改MainActivity,除了給按鈕注冊點擊事件,還需要編寫不同的方法代表不同的邏輯,其中,創(chuàng)建數(shù)據(jù)庫的方法代碼如下:



private void createDBbyLitePal() {

        btn_db_create.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View v) {

                Log.i(TAG,"創(chuàng)建數(shù)據(jù)庫成功");

                LitePal.getDatabase();

            }

        });

    }



僅僅通過點擊按鈕,調(diào)用LitePal.getDatabase();這句api,就可以創(chuàng)建出數(shù)據(jù)庫,讓我們實際進(jìn)入項目中嘗試一下吧!點擊該按鈕,然后查看控制臺,如圖所示:



出現(xiàn)該句日記,說明數(shù)據(jù)庫創(chuàng)建成功,接下來我們看看這個數(shù)據(jù)庫是否按照我們所設(shè)置好的格式創(chuàng)建出來了,進(jìn)入data/data/你的項目包名/databases,即可查看到該數(shù)據(jù)庫已經(jīng)放置到該目錄下,如圖所示:





3.4 升級數(shù)據(jù)庫

事實上,若想對現(xiàn)有數(shù)據(jù)庫進(jìn)行升級,也是可以實現(xiàn)的。以前我們使用SQLiteOpenHelper來升級數(shù)據(jù)庫的方式,雖說功能是實現(xiàn)了,但你有沒有發(fā)現(xiàn)一個問題,,就是升級數(shù)據(jù)庫的時候我們需要先把之前的表drop掉,然后再重新創(chuàng)建才行。這其實是一個非常嚴(yán)重的問題,因為這樣會造成數(shù)據(jù)丟失,每當(dāng)升級一次數(shù)據(jù)庫,之前表中的數(shù)據(jù)就全沒了。

而使用Litepal,就可以很好地避免這個問題。假設(shè)我們現(xiàn)在有一張新的表Category要加進(jìn)去,同樣編寫它的實體類,代碼如下:



package com.androidframelearn.dao_litapal;



public class Category {

    private int id;

    private String categoryName;

    private int categoryCode;

    public int getId(){

        return id;

    }

    public void setId(int id){

        this.id = id;

    }



    public String getCategoryName(){

        return categoryName;

    }

    public void setCategoryName(String categoryName){

        this.categoryName = categoryName;

    }



    public int getCategoryCode(){

        return categoryCode;

    }

    public void setCategoryCode(int categoryCode){

        this.categoryCode = categoryCode;

    }

}



改完了所有我們想改的東西,只需要記得在litepal.xml將版本號加1就行了。當(dāng)然由于這里還添加了一個新的模型類,因此也需要將它添加到映射模型列表中。修改litepal.xml中的代碼,如下所示:



<?xml version="1.0" encoding="utf-8"?>

<litepal>

    <!--  數(shù)據(jù)庫名  -->

    <dbname value="androidframelearn"/>



    <!--  數(shù)據(jù)庫版本號  -->

    <version value="2"/>



    <!--  指定映射模型  -->

    <list>

        <mapping class="com.androidframelearn.dao_litapal.Book"/>

        <mapping class="com.androidframelearn.dao_litapal.Category"/>

    </list>



    <!--  指定文件的存儲方式  -->

    <!--  <storage value="external" />-->

</litepal>



重新運(yùn)行一下程序,再次創(chuàng)建數(shù)據(jù)庫,就可以完美地完成數(shù)據(jù)庫的升級了。這里的調(diào)試可以使用sqlite工具,這里不再贅述。



3.5 插入數(shù)據(jù)

在講述本節(jié)時,首先回顧一下之前添加數(shù)據(jù)的方法,我們需要創(chuàng)建出一個Contentvalues對象,然后將所有要添加的數(shù)據(jù)put到這個Contentvalues對象當(dāng)中,最后再調(diào)用SQLiteDatabase的insert() 方法將數(shù)據(jù)添加到數(shù)據(jù)庫表當(dāng)中,步驟相當(dāng)繁瑣。

而使用LitePal來添加數(shù)據(jù),這些操作可以簡單到讓你驚嘆!我們只需要創(chuàng)建出模型類的實例,再將所有要存儲的數(shù)據(jù)設(shè)置好,最后調(diào)用一下save()方法就可以了。

同樣地,修改MainActivity,增加插入數(shù)據(jù)的事件方法,代碼如下:



private void insertDatabyLitePal() {

        btn_db_insert.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View v) {

                Book book = new Book();

                book.setName("The Da Vinci Code");

                book.setauthor("Dan Brown");

                book.setPages(454);

                book.setPrice(16.96);

                book.save();

                Log.i(TAG,"插入數(shù)據(jù)成功");

            }

        });

    }



同樣運(yùn)行程序,查看控制臺,如圖所示:



當(dāng)點擊查詢數(shù)據(jù)(下一節(jié)將介紹該邏輯)時,控制臺打印剛剛插入的數(shù)據(jù),如圖所示:





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

使用Litepal同樣可以很輕易地查詢數(shù)據(jù),當(dāng)然了,由于篇幅限制,這里僅僅貼出最簡單的查詢方式,至于關(guān)聯(lián)查詢等稍復(fù)雜的查詢方式,可以去GItHub上參考Litepal的官方文檔進(jìn)行相關(guān)調(diào)用即可。

同樣地,修改MainActivity,增加查看數(shù)據(jù)的事件方法,代碼如下:



private void queryDatabyLitePal() {

        btn_db_query.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View v) {

                List<Book> books = LitePal.findAll(Book.class);

                for (Book book : books){

                    Log.i(TAG,"查詢數(shù)據(jù)成功");

                    Log.d("MainActivity","書名是"+book.getName());

                    Log.d("MainActivity","書的作者是"+book.getAuthor());

                    Log.d("MainActivity","書的頁數(shù)是"+book.getPages());

                    Log.d("MainActivity","書的價格是"+book.getPrice());

                }

            }

        });

    }



相關(guān)的運(yùn)行結(jié)果上一小節(jié)以貼出,這里不再重復(fù)。



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

更新數(shù)據(jù)要比添加數(shù)據(jù)稍微復(fù)雜一點,因為它的API接口比較多,這里我們只介紹最常用的幾種更新方式。

首先,最簡單的一種更新方式就是對已存儲的對象重新設(shè)值,然后重新調(diào)用save()方法即可。那么這里我們就要了解一個概念,什么是已存儲的對象?

對于LitePal來說,對象是否已存儲就是根據(jù)調(diào)用model.isSaved()方法的結(jié)果來判斷的, 返回true就表示已存儲,返回false就表示未存儲。那么接下來的問題就是,什么情況下會返回true,什么情況下會返回false呢?

實際上只有在兩種情況下model.isSave()方法才會返回true, 一種情況是已經(jīng)調(diào)用過model. save()方法去添加數(shù)據(jù)了,此時model會被認(rèn)為是已存儲的對象。另一種情況是model對象是通過LitePal提供的查詢API查岀來的,由于是從數(shù)據(jù)庫中查到的對象,因此也會被認(rèn)為是已存儲的對象。

由于查詢API相對復(fù)雜,因此只能先通過第一種情況來進(jìn)行驗證。修改MainActivity中的代碼,如下所示:



private void updateDatabyLitePal() {

        btn_db_update.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View v) {

                Book book = new Book();

                book.setName("The Lost Symbol");

                book.setauthor("Dan Brown");

                book.setPages(510);

                book.setPrice(19.95); // 第一次設(shè)置商品價格

                book.save();

                book.setPrice(10.99); // 第二次設(shè)置商品價格

                book.save();

                Log.i(TAG,"更新數(shù)據(jù)成功");

            }

        });

    }



可以看到,我們做了跟插入數(shù)據(jù)類似的事情,但是我們對數(shù)據(jù)的價格進(jìn)行了設(shè)置,運(yùn)行程序,如圖所示:



可以看到,除了剛剛插入的數(shù)據(jù),還有第二條剛剛更新過后的數(shù)據(jù)。然而這種更新方式只能對已存儲的對象進(jìn)行操作,限制性比較大,接下來我們學(xué)習(xí)另外一種更加靈巧的更新方式,可以調(diào)用以下api:



book.updateAll("name = ? and author = ?","The Lost Symbol","Dan Brown");

1

這里僅貼出其中一條api,其他的可以參考官方文檔,這里不再贅述。



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

使用Litepal刪除數(shù)據(jù)的方式主要有兩種,第一種比較簡單,就是直接調(diào)用已存儲對象的delete()方法就可以了,對于已存儲對象的概念,我們在之前已經(jīng)學(xué)習(xí)過了。也就是說,調(diào)用過save()方法的對象,或者是通過LitePal提供的查詢API查出來的對象,都是可以直接使用delete()方法來刪除數(shù)據(jù)的。這種方式比較簡單,我們就不進(jìn)行代碼演示了,下面直接來看另外一種刪除數(shù)據(jù)的方式。

代碼如下:



private void deleteDatabyLitePal() {

        btn_db_delete.setOnClickListener(new View.OnClickListener() {

            @Override

            public void onClick(View v) {

                LitePal.deleteAll(Book.class,"price < ?","15");

                Log.i(TAG,"刪除成功");

            }

        });

    }



運(yùn)行程序,刪除過后,按照代碼邏輯,已經(jīng)刪除掉了所有price小于15的條目,如圖所示:





4.版本異同

之前閱讀了郭霖老師所著《Android第一行代碼 第二版》時,所記載的Litepal版本為:



compile 'org.litepal.android:core:1.4.1'

1

而的Litepal版本(Java版本,另有Kotlin版本,導(dǎo)入的依賴稍有不同)為:



implementation 'org.litepal.android:java:3.0.0'

1

新舊版本的主要區(qū)別是一些類名的劃分,例如老板本的DataSupport變成了LitePalSupport,除此之外,一些api的名稱也稍有變動,讀者在使用時最好可以參考GitHub上的官方文檔,及時更新代碼,做到與時俱進(jìn)。



5.源碼地址

AFL——Android框架學(xué)習(xí)


日歷

鏈接

個人資料

藍(lán)藍(lán)設(shè)計的小編 http://www.sdgs6788.com

存檔

嫩草影院久久99_老司机午夜网站国内精品久久久久久久久_久久夜色精品国产_国产一级做a爰片久久毛片
<em id="09ttv"></em>
    <sup id="09ttv"><pre id="09ttv"></pre></sup>
    <dd id="09ttv"></dd>

        • 一区二区三区日韩在线观看| 伊人久久男人天堂| 亚洲一区二区三区四区在线观看 | 99国产精品99久久久久久粉嫩| 亚洲激情在线激情| 欧美四级在线观看| 欧美视频福利| 国产精品美女在线| 久久精品男女| 免费影视亚洲| 欧美二区在线播放| 亚洲国产日韩在线| 在线视频亚洲欧美| 欧美一区在线直播| 久久久久久久久久码影片| 女人色偷偷aa久久天堂| 欧美精品www在线观看| 欧美日韩一视频区二区| 国产毛片久久| 亚洲欧洲在线视频| 亚洲综合导航| 蜜臀久久99精品久久久画质超高清| 乱中年女人伦av一区二区| 亚洲国产一区二区三区在线播| 亚洲精选大片| 亚洲欧美日韩在线不卡| 久久亚洲精品一区二区| 欧美视频一区在线观看| 国产亚洲精久久久久久| 欧美午夜精品理论片a级按摩| 国产精品美女午夜av| 国产综合亚洲精品一区二| 亚洲第一在线| 国产精品99久久久久久白浆小说| 久久亚洲私人国产精品va| 欧美电影免费观看大全| 99在线精品观看| 久久久www成人免费毛片麻豆| 欧美视频在线一区| 亚洲国产精品一区二区第四页av| 一区二区欧美日韩视频| 久久精品人人爽| 亚洲欧洲日产国码二区| 亚洲在线播放| 欧美激情麻豆| 国产真实久久| 亚洲影院在线观看| 欧美激情国产日韩| 午夜国产精品影院在线观看 | 欧美精品综合| 狠狠网亚洲精品| 午夜亚洲福利| 国产日韩欧美高清免费| 国产午夜精品理论片a级大结局| 国产精品免费视频xxxx| 狠狠色综合网站久久久久久久| aa成人免费视频| 久久精品国产第一区二区三区| 久久精品一区二区三区不卡牛牛| 日韩视频免费观看| 乱码第一页成人| 在线不卡视频| 久久久水蜜桃| 久久精品91久久久久久再现| 国产精品永久| 亚洲欧美高清| 亚洲网友自拍| 国产精品人人爽人人做我的可爱 | 欧美激情一区三区| 久久五月天婷婷| 亚洲国产日本| 欧美大胆人体视频| 亚洲欧美日韩精品久久久| 国产精品a久久久久| 亚洲欧美成人一区二区三区| 亚洲黄色影院| 欧美高清在线视频| 激情婷婷欧美| 亚洲一区欧美一区| 国产精品成人v| 亚洲欧美视频在线观看视频| 亚洲电影在线播放| 亚洲福利视频在线| 亚洲一区二区在线视频| 亚洲在线观看免费| 国产伦精品一区二区三区在线观看| 欧美在线视频日韩| 欧美呦呦网站| 樱桃视频在线观看一区| 欧美成人午夜免费视在线看片| 两个人的视频www国产精品| 亚洲国产天堂久久国产91| 欧美高清视频一二三区| 免费一级欧美片在线播放| 亚洲淫性视频| 久久se精品一区精品二区| 国产主播一区二区| 欧美gay视频激情| 欧美午夜精品一区二区三区| 久久久精品日韩欧美| 玖玖综合伊人| 亚洲综合精品自拍| 久久精品国产99精品国产亚洲性色 | 欧美.日韩.国产.一区.二区| 欧美粗暴jizz性欧美20| 亚洲视频一区在线观看| 欧美一区二区三区在线播放| 亚洲一区二区免费视频| 亚洲一区影音先锋| 永久555www成人免费| 亚洲国产裸拍裸体视频在线观看乱了中文 | 欧美日韩亚洲在线| 久久综合精品一区| 欧美图区在线视频| 久久蜜桃资源一区二区老牛| 欧美精品导航| 女女同性精品视频| 国产精品久久久久国产a级| 久久综合五月天婷婷伊人| 欧美日韩中文字幕在线| 亚洲第一免费播放区| 国产精品视频免费一区| 亚洲人成在线观看| 亚洲大胆在线| 一区二区激情视频| 久久综合给合久久狠狠狠97色69| 亚洲亚洲精品三区日韩精品在线视频 | 欧美成人精品三级在线观看| 亚洲一区日韩在线| 欧美电影美腿模特1979在线看| 亚洲欧美国产精品va在线观看 | 欧美在线在线| 欧美在线播放一区| 久久久精品动漫| 亚洲午夜黄色| 欧美女同视频| 亚洲国产成人av好男人在线观看| 国产精品久久久久久久免费软件| 亚洲激情成人在线| 亚洲欧洲在线视频| 免费一级欧美片在线播放| 久久久国产精品一区| 欧美视频在线观看一区| 99精品国产99久久久久久福利| 最近中文字幕日韩精品| 久久av资源网| 免费永久网站黄欧美| 亚洲国产精品久久久久婷婷老年| 亚洲视频999| 一区二区免费看| 午夜宅男久久久| 久久久精品免费视频| 韩国在线一区| 欧美成人精品在线播放| 亚洲精品小视频| 亚洲午夜久久久久久尤物| 欧美午夜女人视频在线| 黄色成人av网站| 美女国内精品自产拍在线播放| 久久夜色精品国产| 亚洲激情综合| 欧美四级电影网站| 亚洲一区二区影院| 国产美女扒开尿口久久久| 亚洲女同精品视频| 久久国产精彩视频| 伊人影院久久| 欧美成人综合在线| 一区二区三区.www| 亚洲宅男天堂在线观看无病毒| 久久婷婷人人澡人人喊人人爽| 亚洲永久免费| 黄色成人在线观看| 久久这里有精品视频| 亚洲级视频在线观看免费1级| 一区二区三区精品| 精品二区视频| 欧美日韩中文字幕综合视频| 亚洲一区二区成人在线观看| 男同欧美伦乱| 久久精品国产精品亚洲精品| 亚洲精品免费一区二区三区| 国产精品一区一区三区| 久久资源av| 欧美在线播放高清精品| 亚洲免费观看高清完整版在线观看熊| 久久精品二区三区| 中文在线不卡视频| 亚洲福利在线视频| 国产精品自拍小视频| 欧美日韩免费观看一区=区三区| 欧美一区二区三区视频在线 | 国产精品高潮呻吟久久av黑人| 国产欧美一区二区三区久久人妖| 一区二区国产在线观看| 黑人巨大精品欧美一区二区| 欧美天天影院| 欧美精品一卡二卡| 蜜臀av一级做a爰片久久| 亚洲午夜激情免费视频|