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"><Buttonandroid:id="@+id/create_database"android:layout_width="match_parent"android:layout_height="wrap_content"android:text = "Create database"/><Buttonandroid:id="@+id/add_data"android:layout_width="match_parent"android:layout_height="wrap_content"android:text = "Add data"/><Buttonandroid:id="@+id/update_data"android:layout_width="match_parent"android:layout_height="wrap_content"android:text = "Updata data"/><Buttonandroid:id="@+id/delete_data"android:layout_width="match_parent"android:layout_height="wrap_content"android:text = "Delete data"/><Buttonandroid: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

root@generic_x86:/ # cd data/data/com.example.litepaltest
root@generic_x86:/data/data/com.example.litepaltest # cd databases

127|root@generic_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 {@Overrideprotected 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() {@Overridepublic void onClick(View view) {LitePal.getDatabase();}}); Button addData = (Button) findViewById(R.id.add_data);addData.setOnClickListener(new View.OnClickListener() {@Overridepublic 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 {@Overrideprotected 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() {@Overridepublic void onClick(View view) {LitePal.getDatabase();}});Button addData = (Button) findViewById(R.id.add_data);addData.setOnClickListener(new View.OnClickListener() {@Overridepublic 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() {@Overridepublic 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 {@Overrideprotected 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() {@Overridepublic void onClick(View view) {LitePal.getDatabase();}});Button addData = (Button) findViewById(R.id.add_data);addData.setOnClickListener(new View.OnClickListener() {@Overridepublic 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() {@Overridepublic 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 {@Overrideprotected 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() {@Overridepublic void onClick(View view) {LitePal.getDatabase();}});Button addData = (Button) findViewById(R.id.add_data);addData.setOnClickListener(new View.OnClickListener() {@Overridepublic 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() {@Overridepublic 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 {@Overrideprotected 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() {@Overridepublic void onClick(View view) {LitePal.getDatabase();}});Button addData = (Button) findViewById(R.id.add_data);addData.setOnClickListener(new View.OnClickListener() {@Overridepublic 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() {@Overridepublic 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() {@Overridepublic 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 {@Overrideprotected 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() {@Overridepublic void onClick(View view) {LitePal.getDatabase();}});Button addData = (Button) findViewById(R.id.add_data);addData.setOnClickListener(new View.OnClickListener() {@Overridepublic 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() {@Overridepublic 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() {@Overridepublic void onClick(View view) {DataSupport.deleteAll(Book.class,"price<?","15");}});Button queryButton = (Button)findViewById(R.id.query_data);queryButton.setOnClickListener(new View.OnClickListener() {@Overridepublic 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數據庫,以后,我們會進行詳細解釋。



本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/274112.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/274112.shtml
英文地址,請注明出處:http://en.pswp.cn/news/274112.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

listview頻繁刷新報錯

在Android編程中使用Adapter時&#xff0c;偶爾會出現如下錯誤&#xff1a;The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI t…

Android 第十三課 SharedPreferences存儲

SharedPreferences是使用鍵值對的方式來存儲數據的。當保存一條數據時&#xff0c;需要給這條數據提供一個對應的鍵&#xff0c;這樣在讀取數據的時候就可以通過這個鍵把相應的值取出來。而且支SharedPreferences還支持多種不同的數據類型存儲&#xff0c;例如&#xff1a;如果…

DSP的Gel作用

轉自&#xff1a;http://blog.csdn.net/azhgul/article/details/6660960最近剛在研究Davinci系&#xff0c;特此MARK下&#xff0c;以資后續學習之用。 DSP的Gel作用 1 GEL文件基本作用 當CCSStudio啟動時&#xff0c;GEL文件加載到PC機的內存中&#xff0c;如果定義了StartUp(…

解決關于登錄校園網顯示不在IP段的問題方案(要看注意事項哦!)

有時&#xff0c;登錄校園網&#xff0c;賬號和密碼都顯示正確&#xff0c;但是卻顯示出“賬號只能在指定IP段登錄”的問題。 那我們就提供了一個解決方案&#xff1a; 使用WinR,并在輸入框&#xff0c;輸入cmd命令&#xff1a;&#xff08;如下&#xff09;接著輸入&#xff1…

jquery插件編寫

jQuery為開發插件提拱了兩個方法&#xff0c;分別是&#xff1a; jQuery.fn.extend(object); jQuery.extend(object); jQuery.extend(object); 為擴展jQuery類本身.為類添加新的方法。可以理解為添加靜態方法。是全局的&#xff08;位于jQuery命名空間內部的函數&#xff09;…

gtk/Glade編程 編譯命令不成功 解決方法

摘自&#xff1a;http://blog.chinaunix.net/uid-26746982-id-3433656.html 當我們編寫gtk/glade程序&#xff0c;gcc編譯時&#xff0c;用如下命令&#xff1a; #gcc -o server server.c pkg-config --cflags --libs gtk-2.0 報錯&#xff1a;/tmp/ccoXadAd.o: In function …

Android 第十五課 如何使用LitePal從SQLite數據庫中刪除數據(十四課用來保留講解如何向SQLite數據庫中存入數據)

使用LitePal刪除數據的方式主要有兩種&#xff0c;第一種就是直接調用已存對象的delete()方法&#xff0c;所謂已存儲對象就是調用過save()方法的對象&#xff0c;或者說是通過LitePal提供的查詢API查出來的對象&#xff0c;都是可以直接使用delete方法來刪除對象的。這是比較簡…

頁面返回頂部(方法比較)

下面就說下簡單的返回頂部效果的代碼實現&#xff0c;附注釋說明。 1. 最簡單的靜態返回頂部&#xff0c;點擊直接跳轉頁面頂部&#xff0c;常見于固定放置在頁面底部返回頂部功能 方法一&#xff1a;用命名錨點擊返回到頂部預設的id為top的元素 html代碼 <a href"#top…

Android 第十六課 使用LitePal查詢數據

LitePal在查詢API方面做了非常多的優化&#xff0c;基本上可以滿足絕大多數場景的查詢需求&#xff0c;并且代碼也十分整潔。 例如我們需要查詢表中的所有數據&#xff1a; List<books> DataSupport.findAll(Book.class); 沒有冗長的參數列表&#xff0c;只需要調用一下…

linux創建桌面圖標,和開始菜單欄圖標

轉自&#xff1a;http://blog.csdn.net/qq_25773973/article/details/50514767 ###環境&#xff1a;Mint17&#xff0c;&#xff08;其他類似的linux系統是一樣的&#xff09; 如果開始菜單有圖標&#xff0c;創建桌面圖標很簡單&#xff0c;右鍵添加到桌面即可。 如果沒有&am…

ScrollView中使用ListView

轉自 http://blog.csdn.net/fzh0803/article/details/7971391 由于scrollview和listview不能直接共存&#xff0c;在scrollview中直接使用lsitview的話只會顯示一個條目&#xff0c;要使他們共存&#xff0c; 據我所知&#xff0c;有三種方法&#xff1a; 1。如果listview的高度…

Android 第十四課 使用LitePal添加數據(更新數據)

我們注意到當你登錄一個app&#xff0c;是不是需要先注冊呢&#xff1f;&#xff0c;所謂注冊&#xff0c;簡單地來理解是不是就是把輸入框中地數據傳入數據庫中呢&#xff1f; 這里我們設置簡單一點&#xff0c;注冊的信息只包括兩項&#xff0c;一項是用戶名&#xff0c;另一…

微信公眾平臺的服務號和訂閱號

微信公眾平臺 服務號 訂閱號 作者&#xff1a;方倍工作室 地址&#xff1a;http://www.cnblogs.com/txw1958/p/ServiceNumber-subscriptionNumber.html 什么是服務號&#xff1f; 服務號給企業和組織提供更強大的業務服務與用戶管理能力&#xff0c;幫助企業快速實現全新的公眾…

Android 第十七課 碎片的簡單用法及動態添加碎片

Fragment(碎片)是一種可以嵌入在活動當中的UI片段&#xff0c;它可以讓程序更加合理和充分的利用大屏幕的空間。碎片和活動太像了&#xff0c;同樣都包含布局&#xff0c;都有自己的聲明周期&#xff0c;可以將碎片理解為一種迷你型的活動。 新建FragmentTest項目。假設項目已經…

在Linux下禁用鍵盤、鼠標、觸摸板(筆記本)等輸入設備

在Linux系統下禁用鍵盤、觸摸板、鼠標等輸入設備&#xff0c;可以通過xinput命令來實現&#xff1a;主要涉及&#xff1a;#xinput list#xinput list-props list-number#xinput set-prop list-number func-number 1/0具體操作如下&#xff1a;step1&#xff1a;查看系統中有那些…

委托又給我惹麻煩了————記委托鏈的取消注冊、獲取返回值

今天改bug碰到了一個問題&#xff0c;有多個方法注冊到了一個事件里去&#xff0c;而這些方法本身又有點兒互斥&#xff0c;因而造成了bug&#xff0c;哥調試半天才發現&#xff0c;郁悶至極&#xff0c;遂復習了以前的知識并進行適當延伸&#xff0c;再將成果記錄及分享之&…

Python第一課

對python仰慕已久&#xff0c;今日下定決心學習。可能我是一時頭腦發熱&#xff0c;但我還是愿意堅持。 先了解一下&#xff1a;命令行模式和Python交互模式 在Windows開始菜單選擇“命令提示符”&#xff0c;就進入到命令行模式&#xff0c;它的提示符類似C:\>&#xff1a;…

C++模板專門化與重載

最近在復習C有關知識&#xff0c;又重新看<<Effective C>>&#xff0c;收獲頗豐。原來以前看這邊書&#xff0c;好多地方都是淺嘗輒止。<<Effective C>>條款25&#xff1a;考慮寫出一個不拋出異常的swap函數&#xff0c;涉及到C模板專門化(Templates S…

Android 第十八課 強大的滾動控件 RecyclerView

步驟&#xff1a; 一、添加依賴庫compilecom.android.support:recyclerview-v7:26.1.0 二、在activity_mian.xml中&#xff0c;添加RecyclerView控件&#xff0c;并占據整個頁面。 三、把你要在RecyclerView中展示的內容&#xff0c;設置成一個實體類Fruit&#xff0c;接著為Re…

通過rtcwake命令設置系統S3(休眠到內存)/S4(掛起到硬盤)一段時間后自動喚醒

rtcwake -m disk -s 60 //S4&#xff08;掛起&#xff09;60秒后自動喚醒 rtcwake -m mem -s 60 //S3(休眠&#xff09;60秒后自動喚醒