編輯:關於Android編程
SQLite是Android系統內置的數據庫,是一種輕量級的關系型數據庫,它運算速度快,占用資源少,非常適合在移動設備上使用。同時,它不僅支持標准的SQL語法,還遵循了數據庫的ACID事務。
一、創建數據庫
Android為了讓我們方便地管理數據庫,提供了一個SQLiteOpenHelper幫助類,借助於這個類可以非常簡單地對數據庫進行創建和升級。
1 . SQLiteOpenHelper類介紹
該類是一個抽象類,其中包含兩個抽象方法,分別是onCreate()和onUpgrade()我們必須在自己的類中重寫這兩個方法,分別在兩個方法中實現創建、升級數據庫的邏輯。
SQLiteOPenHelper中還有兩個重要的實例方法,getReadableDatabase()和getWritableDatabase()這兩個方法都可以創建或打開一個現有的數據庫(如果數據庫存在則直接打開,否則創建一個新的數據庫),並返回一個可對數據庫進行讀寫操作的對象。不同的是,當數據庫不可寫入的時候(比如磁盤空間已滿),getReadableDatabase()返回的對象將以只讀方式打開數據庫,而getWritableDatabase()方法將拋出異常。
SQLiteOpenHelper中有兩個構造方法可供重寫,一般使用參數少一點的那個構造方法。該構造方法接收四個參數,第一個參數是Context,第二個參數是數據庫名,第三個參數允許我們在查詢數據的時候返回一個自定義的Cursor,一般傳入null,第四個參數表示當前數據庫的版本號,可用於對數據庫進行升級操作。構建出SQLiteOPenHelper的實例之後,再調用它的getReadableDatabase()或getWritableDatabase()方法就能夠創建數據庫了。此時,重寫的onCreate()方法也會得到執行,所以通常會在這裡處理一些創建表的邏輯。
2 . SQLite的數據類型
integer —————— 整型 real ————————浮點型 text ————————文本類型 blob ————————二進制類型3 . 代碼示例
1 . 首先創建一個Book表,建表語句如下:
create table Book(
id integer primary key autoincrement,
author text,
price real,
pages integer,
name text
)
2 . 新建類繼承自SQLiteOpenHelper,重寫其中的構造方法和抽象方法。
public class MyDatabaseHelper extends SQLiteOpenHelper{
//創建Book表的語句
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 sqLiteDatabase) {
//執行建表語句
sqLiteDatabase.execSQL(CREATE_BOOK);
Toast.makeText(mContext, "數據表創建成功", Toast.LENGTH_SHORT).show();
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
}
3 . 在Activity中通過點擊按鈕觸發創建數據庫操作。
public class SqliteActivity extends AppCompatActivity {
private MyDatabaseHelper myDatabaseHelper;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sqlite);
//創建數據庫為BookStore.db,不返回自定義的Cursor,數據庫版本為1
myDatabaseHelper = new MyDatabaseHelper(this, "BookStore.db", null, 1);
Button btnCreateDb = (Button) findViewById(R.id.create_db);
btnCreateDb.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//點擊按鈕創建數據庫,同時執行onCreate()中的建表語句
myDatabaseHelper.getWritableDatabase();
}
});
}
}
先使用構造函數獲得SQLiteOpenHelper實例,然後在點擊按鈕時觸發getWritableDatabase()方法,執行了數據庫創建,然後默認調用onCreate()方法在數據庫BookStore.db裡面創建數據表Book。
這個時候運行程序,數據庫BookStore.db和數據表應Book應該就創建好了。接下來我們要查看創建好的數據庫。
二、查看數據庫
adb是Android SDK中自帶的一個調試工具,它可以通過命令行對連接在電腦上的真機或者模擬器進行調試。它存放在SDK的platform-tools目錄下 。你可以把該路徑加到環境變量裡面,以便在任意目錄下可以通過命令行使用adb工具。這裡我們采用adb和sqlite3來查看創建的數據庫和數據表。
由於我使用的是Genymotion 模擬器,並且使用的是Genymotion默認的自帶的adb工具,所以需要在Genymotion安裝目錄的tools目錄下找到adb工具。
1 . 打開命令行,輸入 adb shell打開adb交互命令行。
2 . 通過 cd 命令切換到指定目錄, cd /data/data/packagename/databases/,此處的packagename是指你項目的包名,通過輸入 ls 命令 查看該目錄下的文件。會發現有剛才創建的BookStore.db數據庫文件。
3 . 通過sqlite3來查看數據庫結構。繼續輸入 sqlite3 BookStore.db打開數據庫。輸入.table就可以看見剛剛創建的Book表,輸入.schema就可以看見看見建表語句。
如下圖:
說明:
1 . 在 databases目錄下還會有一個BookStore.db-journal文件是為了讓數據庫能夠支持事務而產生的臨時文件。
2 . 輸入.table 之後還有一張表 android_metadata是每個數據庫都會自動生成的表。
三、升級數據庫
如果我們已經創建好了數據表Book,現在想再創建另一張數據表,我們是不能簡單在onCreate()方法裡面再添加
sqLiteDatabase.execSQL(CREATE_BOOK)
這句的,由於Book表已經存在,我們的onCreate()方法不會再執行,這樣就不能再創建數據表了。
解決方法有兩種:
卸載程序,此時數據庫也會被刪除,重新安裝程序運行,就會執行onCreate()方法,就會創建兩張數據表。 借助於onUpgrade()方法。要想讓onUpgrade()方法執行,我們只需要在new SQLiteOpenHelper時將數據庫的版本 改為大於2,這樣就會執行該方法,代碼如下。
myDatabaseHelper = new MyDatabaseHelper(this, "BookStore.db", null, 2);
同時修改onUpgrade()中的代碼:
public class MyDatabaseHelper extends SQLiteOpenHelper{
//創建Book1表的語句
public static final String CREATE_BOOK1 = "create table Book1("
+ "id integer primary key autoincrement, "
+ "author text, "
+ "price real, "
+ "pages integer, "
+ "name text)";
//創建Book2表的語句
public static final String CREATE_BOOK2 = "create table Book2("
+ "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 sqLiteDatabase) {
//執行建表語句
sqLiteDatabase.execSQL(CREATE_BOOK1);
sqLiteDatabase.execSQL(CREATE_BOOK2);
Toast.makeText(mContext, "數據表創建成功", Toast.LENGTH_SHORT).show();
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
sqLiteDatabase.execSQL("drop table if exists Book1");
sqLiteDatabase.execSQL("drop table if exists Book2");
onCreate(sqLiteDatabase);
}
}
先看要新建的表是否存在,如果存在先刪除,然後在onUpgrade()方法中調用onCreate()方法創建數據表。
四、插入數據
上面我們在使用getReadableDatabase()創建和升級數據庫,其實它還會返回一個SQLiteDatabase對象,借助於這個對象我們對數據庫進行操作。
插入數據使用insert()方法,該方法接受三個參數,第一個參數是要插入數據的表名,第二個參數在未指定添加數據的情況下給某些可為空的列自動賦值NULL,一般直接傳入null即可,第三個參數是ContentValues對象,它提供一系列的put()方法以鍵值對的方式給每個列名傳入對應的數據。
//向數據庫中添加數據
private void addData() {
db = myDatabaseHelper.getWritableDatabase();
ContentValues contentValues1 = new ContentValues();
contentValues1.put("name", "bingjian");
contentValues1.put("author", "冰鑒");
contentValues1.put("pages", 453);
contentValues1.put("price", 16.0);
//插入第一組數據
db.insert("Book1", null, contentValues1);
contentValues1.clear();
contentValues1.put("name", "bingjian2");
contentValues1.put("author", "冰鑒2");
contentValues1.put("pages", 455);
contentValues1.put("price", 12.0);
//插入第二組數據
db.insert("Book1", null, contentValues1);
}
接下來按照上面的方式使用adb和sqlite3打開BooStore數據庫,輸入select * from Book1;就可以查看的剛才插入的數據。如下圖:
五、更新數據
更新數據使用update()方法,該方法有四個參數,第一個參數是表名,第二個參數是ContentValues對象,在這裡面組裝要更新的數據,第三第四個參數用於約束更新某一行或某幾行中的數據。不指定就是默認更新所有行。
private void updateData() {
ContentValues contentValues = new ContentValues();
contentValues.put("price", 10.99);
db.update("Book1", contentValues, "name = ?", new String[]{"bingjian"});
}
上面的update()函數第三個參數對應的SQL語句的where部分,表示去更新所有name等於?的行,而?是一個占位符,可以通過第四個參數的字符串替換占位符。
六、刪除數據
更新數據使用delete()方法,該方法有三個參數,第一個參數是表名,第二、第三個參數是用於約束刪除某一行或某幾行中的數據。不指定就是默認刪除所有行。
//刪除數據庫中的數據
private void deleteData() {
db.delete("Book1", "pages > ?", new String[]{"400"});
}
上面的代碼會刪除Book1表中的pages大於400的數據。也是使用了占位符來指定約束條件。
七、查詢數據
對sqlite數據庫的查詢使用query()方法,哎方法有很多不同的重載方式,其中參數最少的一種也需要以下七個參數,下表給出了每個參數的含義。
一般我們傳入query的幾個參數就可以獲取到要查詢的數據,該方法返回一個Cursor對象,查詢到的所有數據都將從這個對象中取出。
//從數據庫中查詢數據
private String queryData() {
Cursor cursor = db.query("Book1", null, null, null, null, null, null);
String content = "";
if (cursor.moveToFirst()){
do{
//遍歷Cursor對象,取出數據(注意字段的類型)
String name = cursor.getString(cursor.getColumnIndex("name"));
String author = cursor.getString(cursor.getColumnIndex("author"));
int pages = cursor.getInt(cursor.getColumnIndex("pages"));
double price = cursor.getDouble(cursor.getColumnIndex("price"));
content = content + name;
content = content + author;
content = content + String.valueOf(pages);
content = content + String.valueOf(price);
}while (cursor.moveToNext());
}
cursor.close();
return content;
}
上面通過循環遍歷從cursor中取出了查詢結果。我們可以給query指定更多參數來獲取我們想要的數據。
七、使用SQL語操作數據庫
Android中可以直接通過函數執行SQL語句來操作數據庫。下面是是簡單的增刪改查的例子。
//添加數據
db.execSQL("insert into Book1(name, author, pages, price) values(?, ?, ?, ?)", new String[] {"mybook", "my", "123", "15.5"});
//刪除數據
db.execSQL("delete from Book1 where pages > ?", new String[] {"120"});
//更新數據
db.execSQL("update Book1 set price = ? where name = ?", new String[]{});
//查詢數據
db.rawQuery("select * from Book1", null);
以上就是sqlite的一些基礎知識。
一、概述最近項目准備嘗試使用webp來縮小包的體積,於是抽空對相關知識進行了調研和學習。至於什麼是webp,使用webp有什麼好處我就不贅述了,具體可以參考騰訊isux上
先上圖看效果 實質上說是動畫有點不妥,確切的說應該是手勢的處理,廢話不多說看代碼public class SimpleDragSample extends Activ
最近群裡有人問如何在mac下進行apk反編譯,我也沒試過,以前都是在windows下進行反編譯的,windows下很簡單,有許多比較好的集成工具,如apkide(改之理)
linux 主機 android sdk安裝忽略jdk安裝忽略hudson安裝忽略 gradle安裝1:下載對應的gradle(這裡是gradle-2
Agenda:一張圖看Camera2框架類圖 CameraService