1. 程式人生 > >Android 第十二課 使用LitePal操作資料庫(記得閱讀最後面的注意事項哦)

Android 第十二課 使用LitePal操作資料庫(記得閱讀最後面的注意事項哦)

一、LitePal簡介

1、(新建專案LitePalTest)

正式接觸第一個開源庫---LitePal
LitePal是一款開源的Android 資料庫框架,它採用了物件關係對映(ORM)的模式。

2、配置LitePal,編輯app/build.gradle檔案,在dependencies閉包中新增如下內容:
dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:26.1.0'
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.1'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'


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

}

這樣我們就成功把LitePal成功引入當前專案中了,接下來需要配置litepal.xml檔案。右擊app/src/main目錄,new一個
Directory,命名為assets,然後在assets目錄下,新建一個litepal.xml。編輯,新增程式碼,如下:
<?xml version="1.0" encoding="utf-8" ?>
<litepal>
    <dbname value = "BookStore222">
    </dbname>


    <version value = "1">
    </version>


    <list>
     </list>


</litepal>


其中,<daname>標籤用於指定資料庫名,<version>標籤用於指定資料庫版本號,<list>標籤用於指定所有的對映模型。

3、最後需要配置一下LitePalApplication,修改AndroidManifest.xml中的程式碼,如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.litepaltest">


    <application

        android:name="org.litepal.LitePalApplication"


        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />


                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>


</manifest>
我們專案的application配置為org.litepal.LitePalApplication,只有這樣才能讓LitePal的所有功能都可以正常
工作,關於application的作用,我們再行介紹。


二、建立和升級資料庫



LitPal採取的是物件關係對映(ORM)的模式,簡單說就是我們使用的程式語言是面嚮物件語言,而使用的資料庫是
關係型資料庫,那麼將面向物件的語言和麵向關係的資料庫之間建立一種對映關係,這就是物件關係對映。


使用LitePal,可以用面向物件的思維來實現功能,定義一個Book類,程式碼如下:
package com.example.litepaltest;


/**
 * Created by ZHJ on 2018/3/4.
 */


public class Book {
    private int id;
    
    private String author;
     
    private  double price;
    
    private  int pages;
    
    private String name;


    public int getId() {
        return id;
    }


    public String getAuthor() {
        return author;
    }


    public double getPrice() {
        return price;
    }


    public int getPages() {
        return pages;
    }


    public String getName() {
        return name;
    }


    public void setId(int id) {
        this.id = id;
    }


    public void setAuthor(String author) {
        this.author = author;
    }


    public void setPrice(double price) {
        this.price = price;
    }


    public void setPages(int pages) {
        this.pages = pages;
    }


    public void setName(String name) {
        this.name = name;
    }
}


這是一個典型的Java bean,在Book中我們定義了id,author,price,pages,name 這幾個欄位,並生成相應的getter和setter
方法(先將類中的欄位定義好,按下Alt+Insert,在彈出的對話方塊中選擇Getter和Setter,接著使用Shift將所有欄位選中。就會自動生成相應的getter和setter方法。)
相信你已經猜到了,Book類就會對應資料庫中的Book表,而類中的每個欄位分別對應了,表中的每個列。
接下來將Book類新增到對映模型列表中,修改litepal.xml中的程式碼,如下:
<?xml version="1.0" encoding="utf-8" ?>
<litepal>
    <dbname value = "BookStore222">
    </dbname>


    <version value = "1">
    </version>


    <list>
        <mapping class = "com.example.litepaltest.Book"></mapping>
    </list>


</litepal>


這裡通過<mapping>標籤來宣告我們要配置的對映模型類,注意是使用完整的類名。不管多少模型類需要對映,
都使用同樣的方式配置在<list>標籤下。


所有工作已經完成了,進行任意的一次資料庫操作,BookStore222.db資料庫就會被自動創建出來。
修改MainActivity中的程式碼,如下:
package com.example.litepaltest;


import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;


import org.litepal.LitePal;


public class MainActivity extends AppCompatActivity {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button createDatabase = (Button) findViewById(R.id.create_database);
        createDatabase.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                LitePal.getDatabase();
            }
        });
    }
}
呼叫LitePal.getDatabase()方法就是一次簡單的資料庫操作,只要點選一下按鈕,資料就自動建立完成了。執行一下程式,

然後點選Create database按鈕,接著通過adb shell (主要在啟動相應模擬器的情況下,在命令列輸入adb shell)檢視一下資料庫建立情況。

注意:

activity_main.xml的佈局程式碼如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">



    <Button
        android:id="@+id/create_database"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text = "Create database"/>
    <Button
        android:id="@+id/add_data"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text = "Add data"/>
    <Button
        android:id="@+id/update_data"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text = "Updata data"/>
    <Button
        android:id="@+id/delete_data"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text = "Delete data"/>
    <Button
        android:id="@+id/query_data"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text = "Query data"/>
    </LinearLayout>

執行程式後:


通過adb shell 檢視一下資料庫建立情況,(使用android 6 模擬器,android 7 似乎不可以進入超級管理員狀態,也就不可以操作資料庫)

adb shell 進入;

cd  data/data/com.example.專案名(listpaltest)

cd  databases

ls

如下:(具體參考《第一行程式碼》第二版P234)


可以看到,這裡有3張表,其中android_metadata表仍然不用管,table_schema是LitePal內部使用的,我麼也可以直接忽視,

book表是我們根據定義的Book類以及勒種的欄位來自動生成的。

使用LitePal來升級資料庫非常容易,只需要將你想改的地方,直接將版本號加1就行了。

我們要向Book表中新增一個Press(出版社)列,直接修改Book類中的程式碼,新增一個press欄位即可。如下:

package com.example.litepaltest;

/**
 * Created by ZHJ on 2018/3/4.
 */

public class Book {
    .....
    
    private String press;
.....
    public String getPress() {
        return press;
    }
....
    public void setPress(String press) {
        this.press = press;
    }
....
    
}

如此同時,我們還想新增一張Category表,那麼只需要新建一個Category類就可以了,程式碼如下:

package com.example.litepaltest;

/**
 * Created by ZHJ on 2018/3/4.
 */

public class Category {
    
    private int id;
    
    private String categoryName;
    
    private int categoryCode;

    public void setId(int id) {
        this.id = id;
    }

    public void setCategoryName(String categoryName) {
        this.categoryName = categoryName;
    }

    public void setCategoryCode(int categoryCode) {
        this.categoryCode = categoryCode;
    }
}

改完了我們想改的東西,只需要記得將版本號加1就行了。

這裡還需要新增一個新的模型類,因此也需要將它新增到對映模型列表中,修改litepal.xm中的程式碼,如下:

<?xml version="1.0" encoding="utf-8" ?>
<litepal>
    <dbname value = "BookStore222">
    </dbname>

    <version value = "2">//原來是1修改之後變為2
    </version>

    <list>
        <mapping class = "com.example.litepaltest.Book" 
        <mapping clss = "com.example.litepaltest.Category"></mapping>//來宣告沃我們要配置的模型類,一定要使用完整的類名。不管有多少模型類需要對映,都要以同樣的方式配置在<lise>標籤下。
    </list>

</litepal>

現在重新執行一下程式,點選Create database按鈕,檢視一下最新的建表語句,

C:\Users\ZHJ>adb shell

[email protected]_x86:/ # cd data/data/com.example.litepaltest
[email protected]_x86:/data/data/com.example.litepaltest # cd databases

127|[email protected]_x86:/data/data/com.example.litepaltest/databases # ls
BookStore222.db
BookStore222.db-journal
qlite3 BookStore222.db                                                        <

sqlite> .table

如下:


我們可以看到,book表中新增了一個press列,category表也建立成功了。當然,LitePal還自動幫我們做了一項非常重要的工作,就是保留之前表中的所有資料,這樣就不用擔心資料丟失的問題了。

三、使用LitePal新增資料

使用LitePal來新增資料。

1、創建出模型類的例項。

2、再將所有要儲存的資料設定好。

3、最後呼叫一下save()方法,就可以了。

開始動手實現,觀察現有的模型類,你會發現沒有繼承結構的。因為LiePal進行表管理操作時不需要模型類有任何的繼承結構,

但是進行CRUD操作時,就不行了。必須要繼承自DataSupport類才行。因此我們需要把繼承結構加上。修改Book類,程式碼如下:

package com.example.litepaltest;

import org.litepal.crud.DataSupport;

/**
 * Created by ZHJ on 2018/3/4.
 */

public class Book extends DataSupport{
    private int id;

    private String author;

    private  double price;

    private  int pages;
......
}

接著我們向Book表中新增資料,修改MainActivity中的程式碼,如下:

package com.example.litepaltest;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import org.litepal.LitePal;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button createDatabase = (Button) findViewById(R.id.create_database);
        createDatabase.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                LitePal.getDatabase();
            }
        });
        
        
        Button addData = (Button) findViewById(R.id.add_data);
        addData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Book book = new Book();
                book.setName("The Da Vinci Code");
                book.setAuthor("Dan Brown");
                book.setPages(454);
                book.setPrice(16.96);
                book.setPress("Unknown");
                book.save();
            }
        });
    }
}

我們首先創建出一個Book的例項,然後呼叫Book類中的各種set方法對資料進行設定,最後再呼叫book.save()方法就能完成資料新增操作。這個save()方法是從DataSupport類中繼承來的,除了save()方法外,DataSupport類還給我們提供了豐富的CRUD方法。

現在執行程式,點選Add data按鈕,此時資料應該已經新增成功了。我們開啟資料庫看一下。


我們點了4次Add Data 按鈕,添加了4個。

四、使用LitePal更新資料庫

更新資料庫比新增資料稍微複雜一些,因為它的API介面比較多。

最簡單的一種更新方式,就是對已經儲存的物件重新設值,然後重新呼叫save()方法即可。

什麼是已經儲存的物件?

對於LitePal來說,物件是否已經儲存就是根據呼叫model.isSaved()方法的結果來判斷的,返回true表示已經儲存,返回false就表示未儲存,那麼什麼情況下,會返回true,什麼情況下,會返回false?實際上,只有兩種情況下model會被認為是已經儲存的物件。

        一種情況是已經呼叫過model.save()方法去新增資料了。此時model會被認為是已儲存的物件。

        另一種情況是model物件是通過LitePal提供的查詢API查出來的,由於是從資料庫中查到的物件,因此也會被認為是已已經儲存的物件。

我們先通過第一種情況來進行驗證。

首先修改MainActivity中的程式碼,如下:

package com.example.litepaltest;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import org.litepal.LitePal;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button createDatabase = (Button) findViewById(R.id.create_database);
        createDatabase.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                LitePal.getDatabase();
            }
        });


        Button addData = (Button) findViewById(R.id.add_data);
        addData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Book book = new Book();
                book.setName("The Da Vinci Code");
                book.setAuthor("Dan Brown");
                book.setPages(454);
                book.setPrice(16.96);
                book.setPress("Unknown");
                book.save();
            }
        });
        
        Button updataData = (Button)findViewById(R.id.update_data);
        updataData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Book book = new Book();
                book.setName("The Lost Symbol");
                book.setAuthor("Dan Brown");
                book.setPages(510);
                book.setPrice(19.95);
                book.setPress("Unkown");
                book.save();
                book.setPrice(10.99);
                book.save();
            }
        });
    }
}

在更新資料按鈕的點選事件裡面,我先是們通過上一小節學習的知識添加了一條Book資料,然後呼叫setPrice()方法將這本的價格進行了修改,之後再次使用了save()方法。此時LitePal會發現當前的Book物件是儲存的,因此不會再向資料庫中新增一條新資料,而是直接會更新當前資料。

執行程式,點選Update data 按鈕。輸入 select * from Book;


我們點了兩次Update data 按鈕,所有會更新兩個資料。

但是這種更新方式只能對已儲存的物件進行操作,限制比較大,我們學習另一種更新方式,修改MainActivity中的程式碼,如下所示:

package com.example.litepaltest;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import org.litepal.LitePal;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button createDatabase = (Button) findViewById(R.id.create_database);
        createDatabase.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                LitePal.getDatabase();
            }
        });


        Button addData = (Button) findViewById(R.id.add_data);
        addData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Book book = new Book();
                book.setName("The Da Vinci Code");
                book.setAuthor("Dan Brown");
                book.setPages(454);
                book.setPrice(16.96);
                book.setPress("Unknown");
                book.save();
            }
        });

        Button updataData = (Button)findViewById(R.id.update_data);
        updataData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Book book = new Book();
               book.setPrice(14.95);
               book.setPress("Anchor");
                book.updateAll("name = ? and author = ?","The Lost Symbol","Dan Brown");
            }
        });
    }
}

在這裡,我們首先new出了一個Book的例項,然後直接呼叫setPrice()和setPress()方法來設定要更新的資料,最後再呼叫updataAll()方法去執行更新操作。注意:updataAll()方法中可以指定一個條件約束,和SQLiteDatabase中的update()方法的where引數部分有點類似,但更加簡潔,如果不指定條件語句,就表示更新所有資料。這裡我們指定將所有書名是The Lost Symbol 並且作者是Dan Brown 書價格更新為14.95,出版社更新為Anchor。

點選Update data按鈕,再次查詢表中的資料情況:


可見第二本書的幾個被更新成了14.95,出版社被更新成了Anchor。

在使用updateAll()方法時,還有一個非常重要的知識點,就是當你想把一個欄位的值更新為預設值時,是不可以使用上面的方式來set資料的。JAVA中任何一種資料型別都會有預設值。對於所有想要將資料更新為預設值的操作,LitePal統一提供了一個setToDefault()方法,然後傳入相應的列名就可以了,比如:

Book book = new Book();

book.setToDefault("pages");

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

這段程式碼意思是將書名是The Lost Symbol,並且做作者是Dan Brown的頁數設定為預設值(就是0)。

package com.example.litepaltest;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import org.litepal.LitePal;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button createDatabase = (Button) findViewById(R.id.create_database);
        createDatabase.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                LitePal.getDatabase();
            }
        });


        Button addData = (Button) findViewById(R.id.add_data);
        addData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Book book = new Book();
                book.setName("The Da Vinci Code");
                book.setAuthor("Dan Brown");
                book.setPages(454);
                book.setPrice(16.96);
                book.setPress("Unknown");
                book.save();
            }
        });

        Button updataData = (Button)findViewById(R.id.update_data);
        updataData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Book book = new Book();
               book.setToDefault("pages");
                book.updateAll("name = ? and author = ?","The Lost Symbol","Dan Brown");
            }
        });
    }
}

下面來檢驗一下:


如上觀看;

因為updateAll()方法中制定了約束條件,若沒有約束條件,此次更新操作會對所有的資料生效。

五、使用LitePal刪除資料

使用LitePal刪除資料的方式主要有兩種,第一種比較簡單,就是直接呼叫已儲存物件的delete()方法就可以。所謂已儲存的物件的含義我們再說一遍,就是呼叫過save()方法的物件,或者是通過LitePal提供的查詢API查詢出來的物件,都是可以直接使用delete()方法來刪除對資料的。這種方式我們就不演示了。

我們來看另一種刪除資料的方式。

修改MainActivity中的程式碼,如下:

package com.example.litepaltest;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

import org.litepal.LitePal;
import org.litepal.crud.DataSupport;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button createDatabase = (Button) findViewById(R.id.create_database);
        createDatabase.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                LitePal.getDatabase();
            }
        });


        Button addData = (Button) findViewById(R.id.add_data);
        addData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Book book = new Book();
                book.setName("The Da Vinci Code");
                book.setAuthor("Dan Brown");
                book.setPages(454);
                book.setPrice(16.96);
                book.setPress("Unknown");
                book.save();
            }
        });

        Button updataData = (Button)findViewById(R.id.update_data);
        updataData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Book book = new Book();
               book.setToDefault("pages");
                book.updateAll("name = ? and author = ?","The Lost Symbol","Dan Brown");
            }
        });


        Button deleteButton = (Button)findViewById(R.id.delete_data);
        deleteButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                DataSupport.deleteAll(Book.class,"price<?","15");
            }
        });
    }
}

這裡呼叫了DataSupport.deleteAll()方法來刪除資料,其中deleteAll()方法的第一個引數用來指定刪除哪一張表中的資料,Book.class意味著刪除Book表中的資料。後面的語句用於指定約束條件。這行程式碼的意思就是刪除price小於15的書。

執行程式,點選按鈕,查詢表中資料,如下:


可以看到低於15的書的資料已經被刪除了。

另外,deleteAll()方法,如果不指定約束條件,就意味著要刪除表中所有的資料和updateAll()方法相似。

六、使用LitePal查詢資料

使用LitePal來查詢資料一點都不復雜,LitePal在查詢API方面的設計及其人性化,基本上可以滿足絕大多數場景的查詢需求,並且程式碼十分整潔。比如我們打算查詢表中的所有資料,使用LitePal如何完成同樣的功能呢?

只需這樣寫:

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

只需要呼叫一下findAll()方法的返回值是一個Book型別的List集合,LitePal已經自動幫我們完成了賦值操作。

修改MainActivity中的程式碼,如下:

package com.example.litepaltest;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

import org.litepal.LitePal;
import org.litepal.crud.DataSupport;

import java.util.List;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button createDatabase = (Button) findViewById(R.id.create_database);
        createDatabase.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                LitePal.getDatabase();
            }
        });


        Button addData = (Button) findViewById(R.id.add_data);
        addData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Book book = new Book();
                book.setName("The Da Vinci Code");
                book.setAuthor("Dan Brown");
                book.setPages(454);
                book.setPrice(16.96);
                book.setPress("Unknown");
                book.save();
            }
        });

        Button updataData = (Button)findViewById(R.id.update_data);
        updataData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Book book = new Book();
               book.setToDefault("pages");
                book.updateAll("name = ? and author = ?","The Lost Symbol","Dan Brown");
            }
        });


        Button deleteButton = (Button)findViewById(R.id.delete_data);
        deleteButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                DataSupport.deleteAll(Book.class,"price<?","15");
            }
        });
        
        Button queryButton = (Button)findViewById(R.id.query_data);
        queryButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                List<Book> books = DataSupport.findAll(Book.class);
                for(Book book: books){
                    Log.d("MainActivity","book name is "+"book.getName");
                    Log.d("MainActivity","book author is "+"book.getAuthor");
                    Log.d("MainActivity","book pages is "+"book.getPages");
                    Log.d("MainActivity","book price is "+"book.getPrice");
                    Log.d("MainActivity","book press is "+"book.getPress");
                }
            }
        });
    }
}

遍歷List集合中的Book物件,並將其中的資訊全部打印出來。現在執行一下程式,點選Query data按鈕。檢視logcat的列印內容。


這樣,我們就已經將這條資料查詢出了。

注意事項:

以上,我們是基於大牛郭霖的《第一行程式碼》系列書籍中的資料庫內容,進行的解釋。再一次從內心中迸發出的自由而不尷尬的崇高敬意。

此外,我們還可以通過操作把輸入框中輸入的資料,通過按鈕傳入到SQLite資料庫,以後,我們會進行詳細解釋。

相關推薦

Android 使用LitePal操作資料庫記得閱讀最後面的注意事項

一、LitePal簡介1、(新建專案LitePalTest)正式接觸第一個開源庫---LitePalLitePal是一款開源的Android 資料庫框架,它採用了物件關係對映(ORM)的模式。2、配置LitePal,編輯app/build.gradle檔案,在dependen

Android 使用LitePal新增資料更新資料

我們注意到當你登入一個app,是不是需要先註冊呢?,所謂註冊,簡單地來理解是不是就是把輸入框中地資料傳入資料庫中呢?這裡我們設定簡單一點,註冊的資訊只包括兩項,一項是使用者名稱,另一項是密碼。我們乾脆建立一個表Driveruser。在Android Studio 中新建一個j

Ng:支持向量機(Support Vector Machines)

.com htm 條件 hid cti 無法 技術 add 效果 7 核函數(Kernels) 考慮我們最初在“線性回歸”中提出的問題,特征是房子的面積x,這裏的x是實數,結果y是房子的價格。假設我們從樣本點的分布中看到x和y符合3次曲線,那麽我們希望使用x的三次多項式來逼

進階 Python模塊之sys

read OS python模塊 leg gac pack uil file pos sys是與Python解釋器交互的工具。 先看下dir(sys) >>> import sys >>> dir(sys) [‘__displayhoo

指針

空指針 In 語言 str -s nbsp port style pan 一 Go 語言的取地址符是 &   放到一個變量前使用就會返回相應變量的內存地址。 package main import "fmt" func main() { var aa

Django 【class meta】

nbsp keyword 生命周期 元數據 mod 數據庫 完全 創建 together Class meta: 通過一個內嵌類 "class Meta" 給你的 model 定義元數據, 類似下面這樣: class Foo(models.Model):

斯坦福大學-自然語言處理入門 筆記 詞性標註Part-of-speech tagging

一、詞性(part-of-speech)介紹 詞性:名詞(Nouns),動詞(Verbs),形容詞(Adjectives), 副詞(Adverbs)等等就是我們想要研究的詞性 我們可以把詞性分為開放類(open class)和閉合類(closed class)。

C++筆記 經典問題解析一---狄泰學院

#1024程式設計師節# 如果在閱讀過程中發現有錯誤,望評論指正,希望大家一起學習,一起進步。 學習C++編譯環境:Linux 第十二課 經典問題解析一 1.關於const的疑問 const什麼時候是隻讀變數?什麼時候是常量? const常量的判斷準則 只有用字面量初始化

潭州課堂25班:Ph201805201 爬蟲高階 Scrapy-redis分佈 專案實戰 (課堂筆記)

建代理池, 1,獲取多個網站的免費代理IP, 2,對免費代理進行檢測,》》》》》攜帶IP進行請求, 3,檢測到的可用IP進行儲存, 4,實現api介面,方便呼叫, 5,各個元件 的除錯,   西剌代理: http://www.xicidaili.com/nn/   66

Android第二 SurfaceView原始碼以及崩潰剖析

1 在eclipse中檢視Android原始碼 假設我們想參看Activity類的原始碼,按著Ctrl鍵,左擊它,現實的結果卻看不到程式碼的,提示的資訊便是“找不到Activity.class檔案”。下載好Android原始碼之後,點選Attached Source,選擇External locatio

matlab:統計

目標: 統計 統計 概述: 資料的科學 涉及資料的收集,分析,解釋,演示和組織 統計的主要方法: 描述性統計 推理統計  一、推理統計 數值模式和圖形方法查詢模式,總結資料集中的資訊 Mean, Median,

潭州課堂25班:Ph201805201 django框架 自定義中介軟體,上下文處理,admin後臺 (課堂筆記)

中介軟體 在專案主目錄下的配置檔案 在專案主目錄下建立檔案 寫個自定義異常處理   方法1 要讓其生效,要在主目錄下,的中介軟體中進行註冊   主目錄下.該檔名.類名 在進入檢視函式之前進行判斷,  給 request 新增屬性   方法2  

C++筆記 型別轉換函式類型別---其他型別---狄泰學院

如果在閱讀過程中發現有錯誤,望評論指正,希望大家一起學習,一起進步。 學習C++編譯環境:Linux 第四十二課 型別轉換函式(下)類型別—>其他型別 1.問題 類型別是否能夠型別轉換到普通型別?用編譯器測試—可以,引入新的語法規則 2.型別轉換函式 C++類中

mysql篇:查詢語句(五)

  這節課我們來講子查詢:     先來看我們的表和資料:   tbl_dept:     tbl_employee:     接下來看看子查詢的定義: 一條查詢語句中又嵌

C語言筆記 註釋符號

第十二課 註釋符號 註釋是C語言最重要的工具,我們先看自己有沒有能力駕馭它,再討論有沒有必要深究。 註釋規則 編譯器在編譯過程中使用空格替換整個註釋 字串字面量中的//和/**/不代表註釋符號 /…/型註釋不能被巢狀 12-1 註釋規則 有趣的問題 你覺得 y=x/*p是

學習HadoopHadoop序列化機制、Linux安裝Eclipse及建立快捷圖示、使用Maven開發

我看的視訊就是這個,看到有人寫了,就轉過來了 上節課我們一起學習了MapReduce的一個簡單例項,這節課我們一起來學習Hadoop的序列化機制。        首先我們來學習一下,什麼叫做序列化,序列化是指把結構化物件轉換成位元組流,這樣做的目的當然是便於在網路中傳輸。

:Running in the Background基於AndroidStudio3.2

現在我們對UI元素和螢幕有了一些瞭解,我們需要讓它們具有響應性。響應力並不僅僅與速度有關 - 你可以在一段時間內完成多少工作。更重要的是應用程式的速度有多快。當人們說應用程式響應時,通常他們的意思是應用程式不會阻止他們做他們正在嘗試的事情去做。它不會妨礙他們。如果你曾經使用過

潭州課堂25班:Ph201805201 django 專案 文章主頁資料庫模型,前後臺功能實現 (課堂筆記

資料庫模型設計 : 文章:新聞表:   欄位:圖片,標題,摘要,型別,作者,建立時間 標籤表 評論表, 輪播圖:外來鍵,指向文章的外來鍵表   在 apps/verificatios的 models.py  中建立新聞模型     在 ut

javaweb繼承:過濾器

  這節課我們來講講過濾器Filter   Servlet 過濾器可以動態地攔截請求和響應,以變換或使用包含在請求或響應中的資訊。 可以將一個或多個 Servlet 過濾器附加到一個 Servlet 或一組 Servlet。Servlet 過濾器也可以附加到 Ja

tensorflow 使用RNN實現古詩自動生成

上一課中說到RNN的實現原理。這一章,一個古詩生成的demo. 輸入 # coding:utf-8 """ 資料輸入 """ import logging import collections import json import numpy as n