Android應用處理數據的方法
幾種數據存儲方式
a. SQLiteDB
在Android中我們使用SQLiteDB作爲數據庫,它具有以下特點:
- Light : 輕量級
- Standard : 標準化
- Open-Src : 開源
- No Server : 沒有服務器
- Single-tier : 單層的
- Loose-type : 寬鬆類型
- App-process : 在應用程序的進程中進行調用
下面我們挑幾個SQLiteDB的特性進行介紹。
Standard :SQLite是標準兼容的,也就是說SQL語句在SQLite均可使用
Single-tier :是指SQLite是單層的,也就是不含中間層,不需要通過什麼工具訪問數據庫,可以直接訪問。
No Server :SQLite是自包含的數據庫,當你創建的數據庫的時候,這些數據會保存在應用中的某一個文件中
Loose-type :簡單來說就是同一列中的數據可以是不同類型
b. Internal Storage (內部存儲)
用於存放應用程序的相關數據,在內部存儲中,每個應用對應一個文件夾,並且每個文件之間不可相互訪問,應用程序只能訪問與之對應的文件。
c. External Storage(外部存儲)
一般用於存放較大的文件,如圖片、音頻等,在外部存儲中的文件,每個應用程序均可訪問。
d. shared preferences (偏好設置)
用於存儲用戶的偏好信息,用key-value的形式存儲
e. remote storage (網絡存儲)
SQLite文件
a. 存放路徑:/data/data/<package-name>/databases
SQLite文件放置於Android根目錄下的data/data中,以應用程序的名稱作爲包名的文件夾中
b. SQLite文件是私有的,也就是說,僅該程序可訪問,而其他程序不可訪問。
Tips : 一般較大的文件不能直接放在Database中,而應該將大文件的URL放在Database中。
c. 創建數據庫
1. 使用代碼的方式進行創建(code)
- android.database.sqlite.SQLiteData ---在代碼中直接使用
SQLiteDatabase sqlDB=openOrCreateDatabase("test.db",mode:SQLiteDatabase.CREATE_IF_NECESSARY,null)
sqlDB.execSQL("CREATE Table tb1(id INTERGER PRIMARY KEY, name TEXT,phone LONG)");
sqlDB.close();
例如在上述代碼中,我們首先創建一個SQLiteDatebase對象,並對數據庫的name,mode以及factory進行賦值。
然後調用execSQL方法執行數據庫語句來創建表。
SQLiteDatabase的具體使用方法參考開發文檔:
https://developer.android.google.cn/reference/kotlin/android/database/sqlite/SQLiteDatabase?hl=en
- SQLiteOpenHelper
android.database.sqlite.SQLiteData一般直接在Activity中就可直接使用,但是這樣會導致代碼的耦合度過高,爲了降低掉嗎的耦合度,我們採用SQLiteOpenHelper來進行數據庫的相關操作。
值得注意的是,SQLiteOpenHelper是一個抽象類,因此我們在使用的使用需要實現該抽象類,具體的使用方法如下。
在這裏我們爲了更好的展示,將代碼分爲兩個部分。
public class MainActivity extends AppCompatActivity {
...code...
/*在OnCreate直接調用我們所實現的SQLiteOpenHelper類進行數據的插入
(在這裏我們將其命名爲Datahelper)
*/
@Override
protected void onCreate() {
Button bt1 =(Button) findViewById(R.id.button1);
bt1.setOnClickListener(new View.OnClickListener(){....});
Datahelper dh = new DataHelper(); //創建我們實現的Datahelper對象
dh.insert(te.text()); //假設有個名爲te的控件,我們獲取其中的text並通過Datahelper對象將其插入到數據庫中
}
/*實現SQLiteOpenHelper抽象類*/
public class DataHelper{
SQLiteDatabase sqlDB; //創建一個數據庫對象(在android.database.sqlite.SQLiteData部分我們已經做了介紹)
OpenHelper oh;
private final static String dataName; //定義數據庫的名稱
public DataHelper(){
oh = new OpenHelper(this.Context); //用於創建OpenHelper類對象,其中this.Context表示獲取當前的上下文對象
sqlDB = oh.getWritableDatabase(); //定義爲可寫的
}
insert() //實現數據庫的插入方法
{
sqlDB.insert();
}
getTable() //實現數據庫獲取表的方法
{
SQLiteDatabase sqlDB = openorCreate
}
/*實現SQLiteHelper抽象類
*實現SQLiteHelper類中的兩個方法
*onpenHelper方法
*onCreate方法
*/
private static class Openhelper extends SQLiteHelper
{
public OpenHelper (Context context){
super(context,dataName,.....);
}
void onCreate(SQLiteDatabase db){
db.execSQL("create table...");
}
}
}
2. 使用Linux shell進行創建
- 使用cmd命令打開adb.exe
- 輸入adb shell 進入android 的 linux 命令操作方式
- 切換到應用對應的存放數據庫的文件路徑下(這裏博主創建的項目爲myapp)
- 輸入sqlite3 <database-name> 例如:sqlite3 test.db //即創建一個名爲 test 的數據庫
- 接下來就可以進行創建表格插入數據等操作,在這裏就不一一贅述了
- 最後使用 exit 可退出Linux Shell
d. 存儲/獲取數據庫中的信息
- Insert,delete,Update
我們需要先創建一個數據庫,根據上面的介紹,我們可以採用兩種方式進行創建,由於上面已經給出了實現方法,在這裏博主就不重複創建,直接用我們已經創建好的database進行增刪改操作。
已有的數據庫結構 :
- <database> - test.db
- <table-name> - tb1
- <column-name> - name , phone
在Activity類中,我們用一個按鈕來觸發數據庫的插入操作,下列這段代碼放在OnCreate方法中。
TextView tv = (TextView) findViewById(R.id.text1);
Button bt1 =(Button) findViewById(R.id.button1);
bt1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(){
TextView tv = (TextView) findViewById(R.id.text1);
tv.setText("INSERT");
SQLiteDatabase sqlDB = openOrCreateDatabase("test.db", SQLiteDatabase.CREATE_IF_NECESSARY,null);
sqlDB.execSQL("INSERT INTO tb1(name,phone) values('name1','123123123123')");
sqlDB.close();
}
});
運行完程序,我們點擊按鈕後,重新回到命令行窗口,查找我們數據庫中已有表tb1中的數據,發現該記錄已經成功寫入。
接下來我們來到Android開發文檔中找到SQLiteDatabase中的insert方法。
可以發現 SQLiteDatabase的insert方法有三個參數,其中table表示表名,nullColumnHack表示當表的某行爲空時用來代替的字符串,還有一個就是ContentValues,我們接着介紹一下它。
- ContentValue(Android提供的一種數據類型) - 常用於Android中數據庫的添加
我們在剛剛進行INSERT操作的方法中進行修改,用ContentValue的方式來實現
- 創建一個ContentValue對象
- 使用put方法,將對應輸入的內容與每一列的名稱對應起來
- 最後使用SQLiteDatabase中的 insertOrThrow 方法進行插入。
Tips:這裏值得注意的是,insertOrThrow 方法如果插入時出現異常,該方法會拋出異常,因此我們需要將它寫在 try-catch 代碼塊中,並在 catch 中將錯誤信息寫入Android的Log中。
TextView tv = (TextView) findViewById(R.id.text1);
Button bt1 =(Button) findViewById(R.id.button1);
bt1.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(){
TextView tv = (TextView) findViewById(R.id.text1);
tv.setText("INSERT");
SQLiteDatabase sqlDB = openOrCreateDatabase("test.db", SQLiteDatabase.CREATE_IF_NECESSARY, null);
ContentValues cv = new ContentValues();
cv.put("name", "name2");
cv.put("phone", 123123123123L);
try {
sqlDB.insertOrThrow("tb1", null, cv);
} catch (Exception e) {
Log.e("DBerror", e.getMessage());
}
}
});
我們同樣運行程序,觸發該點擊事件後 重新回到命令行窗口,查找我們數據庫中已有表tb1中的數據,發現該記錄已經成功寫入。
- Retrieve records from a table; (從表中獲取記錄)
我們可以通過SQLiteDatabase中的query()方法來實現從表中獲取記錄
同樣我們先看看在Android開發文檔中是如何定義query方法的。
從文檔中我們可以看到query方法具有多種調用方式,在這裏我們選擇第一種進行進一步的探討。
- distinct :如果希望每行唯一,則爲true;否則爲false。
- table :要查詢的表名。
- columns :要查詢的列
- selection :聲明要返回哪些行的篩選器,格式爲sql where子句(不包括where本身)。傳遞null將返回給定表的所有行。
- limit :限制查詢返回的行數,傳遞null表示沒有限制。
Tips :值得注意的是,使用該方法返回的將會是一個Cursor(指針),接下來我們用query方法來實現數據庫的查詢。
TextView tv = (TextView) findViewById(R.id.text1);
Button bt1 = (Button) findViewById(R.id.button1);
bt1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
TextView tv = (TextView) findViewById(R.id.text1);
tv.setText("Dial");
try {
String[] fields = {"name"}; //查詢的列名
Cursor c = sqlDB.query("tb1", fields, null, null, null, null, null, null);
/*將指針指向開頭
*判斷是否爲空
*不爲空則將查詢的結果加入到TextView的文本中進行顯示
*將指針移向下一位
*/
if (c.moveToFirst()) {
while (c.isAfterLast() == false) {
tv.append(c.getString(0) + " ");
c.moveToNext();
}
}
/*如果指針不爲空,則關閉該指針*/
if (c != null)
c.close();
} catch (Exception e) {
Log.e("DBerror", e.getMessage());
} finally {
/*關閉數據庫*/
if (sqlDB != null)
sqlDB.close();
}
}
});
結果展示: