Android SQLite的資料庫檔案儲存在SD卡中(一)
阿新 • • 發佈:2019-02-12
SQLite的特性:
•輕量級
使用 SQLite 只需要帶一個動態庫,就可以享受它的全部功能,而且那個動態庫的尺寸想當小。
•獨立性
SQLite 資料庫的核心引擎不需要依賴第三方軟體,也不需要所謂的“安裝”。
•隔離性
SQLite 資料庫中所有的資訊(比如表、檢視、觸發器等)都包含在一個資料夾內,方便管理和維護。
•跨平臺
SQLite 目前支援大部分作業系統,不至電腦作業系統更在眾多的手機系統也是能夠執行,比如:Android。
•多語言介面
SQLite 資料庫支援多語言程式設計介面。
•安全性
SQLite 資料庫通過資料庫級上的獨佔性和共享鎖來實現獨立事務處理。這意味著多個程序可以在同一時間從同一資料庫讀取資料,但只能有一個可以寫入資料.
優點:
1.能儲存較多的資料。
2.能將資料庫檔案存放到SD卡中!
什麼是 SQLiteDatabase?
一個 SQLiteDatabase 的例項代表了一個SQLite 的資料庫,通過SQLiteDatabase 例項的一些方法,我們可以執行SQL 語句,對資料庫進行增、刪、查、改的操作。需要注意的是,資料庫對於一個應用來說是私有的,並且在一個應用當中,資料庫的名字也是惟一的。
什麼是 SQLiteOpenHelper ?
根據這名字,我們可以看出這個類是一個輔助類。這個類主要生成一個數據庫,並對資料庫的版本進行管理。當在程式當中呼叫這個類的方法getWritableDatabase(),或者getReadableDatabase()方法的時候,如果當時沒有資料,那麼Android 系統就會自動生成一個數 據庫。SQLiteOpenHelper 是一個抽象類,我們通常需要繼承它,並且實現裡邊的3 個函式,
什麼是 ContentValues 類?
ContentValues 類和Hashmap/Hashtable 比較類似,它也是負責儲存一些名值對,但是它儲存的名值對當中的名是一個String 型別,而值都是基本型別。
什麼是 Cursor ?
Cursor 在Android 當中是一個非常有用的介面,通過Cursor 我們可以對從資料庫查詢出來的結果集進行隨機的讀寫訪問。
xml中定義了我們需要練習用到的幾個操作按鈕,這裡不多解釋了,下面看java原始碼:先看我們繼承的 SQLiteOpenHelper 類
java程式碼:
java程式碼:
•輕量級
使用 SQLite 只需要帶一個動態庫,就可以享受它的全部功能,而且那個動態庫的尺寸想當小。
•獨立性
SQLite 資料庫的核心引擎不需要依賴第三方軟體,也不需要所謂的“安裝”。
•隔離性
SQLite 資料庫中所有的資訊(比如表、檢視、觸發器等)都包含在一個資料夾內,方便管理和維護。
•跨平臺
SQLite 目前支援大部分作業系統,不至電腦作業系統更在眾多的手機系統也是能夠執行,比如:Android。
•多語言介面
SQLite 資料庫支援多語言程式設計介面。
•安全性
SQLite 資料庫通過資料庫級上的獨佔性和共享鎖來實現獨立事務處理。這意味著多個程序可以在同一時間從同一資料庫讀取資料,但只能有一個可以寫入資料.
優點:
1.能儲存較多的資料。
2.能將資料庫檔案存放到SD卡中!
什麼是 SQLiteDatabase?
一個 SQLiteDatabase 的例項代表了一個SQLite 的資料庫,通過SQLiteDatabase 例項的一些方法,我們可以執行SQL 語句,對資料庫進行增、刪、查、改的操作。需要注意的是,資料庫對於一個應用來說是私有的,並且在一個應用當中,資料庫的名字也是惟一的。
什麼是 SQLiteOpenHelper ?
根據這名字,我們可以看出這個類是一個輔助類。這個類主要生成一個數據庫,並對資料庫的版本進行管理。當在程式當中呼叫這個類的方法getWritableDatabase(),或者getReadableDatabase()方法的時候,如果當時沒有資料,那麼Android 系統就會自動生成一個數 據庫。SQLiteOpenHelper 是一個抽象類,我們通常需要繼承它,並且實現裡邊的3 個函式,
什麼是 ContentValues 類?
ContentValues 類和Hashmap/Hashtable 比較類似,它也是負責儲存一些名值對,但是它儲存的名值對當中的名是一個String 型別,而值都是基本型別。
什麼是 Cursor ?
Cursor 在Android 當中是一個非常有用的介面,通過Cursor 我們可以對從資料庫查詢出來的結果集進行隨機的讀寫訪問。
xml中定義了我們需要練習用到的幾個操作按鈕,這裡不多解釋了,下面看java原始碼:先看我們繼承的 SQLiteOpenHelper 類
java程式碼:
-
package com.demo;
-
import android.content.Context;
-
import android.database.sqlite.SQLiteDatabase;
-
import android.database.sqlite.SQLiteOpenHelper;
-
import android.util.Log;
-
/**
-
*
-
* @author Himi
-
* @解釋 此類我們只需要傳建一個建構函式 以及重寫兩個方法就OK啦、
-
*
-
*/
-
public class MySQLiteOpenHelper extends SQLiteOpenHelper {
-
public final static int VERSION = 1;// 版本號
-
public final static String TABLE_NAME = "himi";// 表名
-
public final static String ID = "id";// 後面ContentProvider使用
-
public final static String TEXT = "text";
-
public static final String DATABASE_NAME = "Himi.db";
-
public MySQLiteOpenHelper(Context context) {
-
// 在Android 中建立和開啟一個數據庫都可以使用openOrCreateDatabase 方法來實現,
-
// 因為它會自動去檢測是否存在這個資料庫,如果存在則開啟,不過不存在則建立一個數據庫;
-
// 建立成功則返回一個 SQLiteDatabase物件,否則丟擲異常FileNotFoundException。
-
// 下面是來建立一個名為"DATABASE_NAME"的資料庫,並返回一個SQLiteDatabase物件
-
super(context, DATABASE_NAME, null, VERSION);
-
}
-
@Override
-
// 在資料庫第一次生成的時候會呼叫這個方法,一般我們在這個方法裡邊生成資料庫表;
-
public void onCreate(SQLiteDatabase db) {
-
String str_sql = "CREATE TABLE " + TABLE_NAME + "(" + ID
-
+ " INTEGER PRIMARY KEY AUTOINCREMENT," + TEXT + " text );";
-
// CREATE TABLE 建立一張表 然後後面是我們的表名
-
// 然後表的列,第一個是id 方便操作資料,int型別
-
// PRIMARY KEY 是指主鍵 這是一個int型,用於唯一的標識一行;
-
// AUTOINCREMENT 表示資料庫會為每條記錄的key加一,確保記錄的唯一性;
-
// 最後我加入一列文字 String型別
-
// ----------注意:這裡str_sql是sql語句,類似dos命令,要注意空格!
-
db.execSQL(str_sql);
-
// execSQL()方法是執行一句sql語句
-
// 雖然此句我們生成了一張資料庫表和包含該表的sql.himi檔案,
-
// 但是要注意 不是方法是建立,是傳入的一句str_sql這句sql語句表示建立!!
-
}
-
@Override
-
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
-
// 一般預設情況下,當我們插入 資料庫就立即更新
-
// 當資料庫需要升級的時候,Android 系統會主動的呼叫這個方法。
-
// 一般我們在這個方法裡邊刪除資料表,並建立新的資料表,
-
// 當然是否還需要做其他的操作,完全取決於遊戲需求。
-
Log.v("Himi", "onUpgrade");
-
}
- }
java程式碼:
-
package com.demo;
-
import java.io.File;
-
import java.io.IOException;
-
import android.app.Activity;
-
import android.content.ContentValues;
-
import android.database.Cursor;
-
import android.database.sqlite.SQLiteDatabase;
-
import android.os.Bundle;
-
import android.view.View;
-
import android.view.Window;
-
import android.view.WindowManager;
-
import android.view.View.OnClickListener;
-
import android.widget.Button;
-
import android.widget.TextView;
-
// ------------第三種儲存方式--------《SQLite》---------
-
/**
-
* @author Himi
-
* @儲存方式:SQLite 輕量級資料庫、
-
* @優點: 可以將自己的資料儲存到檔案系統或者資料庫當中, 也可以將自己的資料存
-
* 儲到SQLite資料庫當中,還可以存到SD卡中
-
* @注意1:資料庫對於一個遊戲(一個應用)來說是私有的,並且在一個遊戲當中,
-
* 資料庫的名字也是唯一的。
-
* @注意2 apk中建立的資料庫外部的程序是沒有許可權去讀/寫的,
-
* 我們需要把資料庫檔案建立到sdcard上可以解決類似問題.
-
* @注意3 當你刪除id靠前的資料或者全部刪除資料的時候,SQLite不會自動排序,
-
* 也就是說再新增資料的時候你不指定id那麼SQLite預設還是在原有id最後新增一條新資料
-
* @注意4 android 中 的SQLite 語法區分大小寫的!!!!!這點要注意!
-
* String UPDATA_DATA = "UPDATE himi SET text='通過SQL語句來修改資料' WHERE id=1";
-
* 千萬 不能可以寫成
-
* String UPDATA_DATA = "updata himi set text='通過SQL語句來修改資料' where id=1";
-
*/
-
public class MainActivity extends Activity implements OnClickListener {
-
private Button btn_addOne, btn_deleteone, btn_check, btn_deleteTable,
-
btn_edit, btn_newTable;
-
private TextView tv;
-
private MySQLiteOpenHelper myOpenHelper;// 建立一個繼承SQLiteOpenHelper類例項
-
private SQLiteDatabase mysql ;
-
//---------------以下兩個成員變數是針對在SD卡中儲存資料庫檔案使用
-
// private File path = new File("/sdcard/himi");// 建立目錄
-
// private File f = new File("/sdcard/himi/himi.db");// 建立檔案
-
@Override
-
public void onCreate(Bundle savedInstanceState) {
-
super.onCreate(savedInstanceState);
-
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
-
WindowManager.LayoutParams.FLAG_FULLSCREEN);
-
this.requestWindowFeature(Window.FEATURE_NO_TITLE);
-
setContentView(R.layout.main);
-
tv = (TextView) findViewById(R.id.tv_title);
-
btn_addOne = (Button) findViewById(R.id.sql_addOne);
-
btn_check = (Button) findViewById(R.id.sql_check);
-
btn_deleteone = (Button) findViewById(R.id.sql_deleteOne);
-
btn_deleteTable = (Button) findViewById(R.id.sql_deleteTable);
-
btn_newTable = (Button) findViewById(R.id.sql_newTable);
-
btn_edit = (Button) findViewById(R.id.sql_edit);
-
btn_edit.setOnClickListener(this);
-
btn_addOne.setOnClickListener(this);
-
btn_check.setOnClickListener(this);
-
btn_deleteone.setOnClickListener(this);
-
btn_deleteTable.setOnClickListener(this);
-
btn_newTable.setOnClickListener(this);
-
myOpenHelper = new MySQLiteOpenHelper(this);// 例項一個數據庫輔助器
-
//備註1 ----如果你使用的是將資料庫的檔案建立在SD卡中,那麼建立資料庫mysql如下操作:
-
// if (!path.exists()) {// 目錄存在返回false
-
// path.mkdirs();// 建立一個目錄
-
// }
-
// if (!f.exists()) {// 檔案存在返回false
-
// try {
-
// f.createNewFile();//建立檔案
-
// } catch (IOException e) {
-
// // TODO Auto-generated catch block
-
// e.printStackTrace();
-
// }
-
// }
-
}
-
@Override
-
public void onClick(View v) {
-
try {
-
//備註2----如果你使用的是將資料庫的檔案建立在SD卡中,那麼建立資料庫mysql如下操作:
-
// mysql = SQLiteDatabase.openOrCreateDatabase(f, null);
-
//備註3--- 如果想把資料庫檔案預設放在系統中,那麼建立資料庫mysql如下操作:
-
mysql = myOpenHelper.getWritableDatabase(); // 例項資料庫
-
if (v == btn_addOne) {// 新增資料
-
// ---------------------- 讀寫控制代碼來插入---------
-
// ContentValues 其實就是一個雜湊表HashMap, key值是欄位名稱,
-
//Value值是欄位的值。然後 通過 ContentValues 的 put 方法就可以
-
//把資料放到ContentValues中,然後插入到表中去!
-
ContentValues cv = new ContentValues();
-
cv.put(MySQLiteOpenHelper.TEXT, "測試新的資料");
-
mysql.insert(MySQLiteOpenHelper.TABLE_NAME, null, cv);
-
// inser() 第一個引數 標識需要插入操作的表名
-
// 第二個引數 :預設傳null即可
-
// 第三個是插入的資料
-
// ---------------------- SQL語句插入--------------
-
// String INSERT_DATA =
-
// "INSERT INTO himi (id,text) values (1, '通過SQL語句插入')";
-
// db.execSQL(INSERT_DATA);
-
tv.setText("新增資料成功!點選檢視資料庫查詢");
-
} else if (v == btn_deleteone) {// 刪除資料
-
// ---------------------- 讀寫控制代碼來刪除
-
mysql.delete("himi", MySQLiteOpenHelper.ID + "=1", null);
-
// 第一個引數 需要操作的表名
-
// 第二個引數為 id+操作的下標 如果這裡我們傳入null,表示全部刪除
-
// 第三個引數預設傳null即可
-
// ----------------------- SQL語句來刪除
-
// String DELETE_DATA = "DELETE FROM himi WHERE id=1";
-
// db.execSQL(DELETE_DATA);
-
tv.setText("刪除資料成功!點選檢視資料庫查詢");
-
} else if (v == btn_check) {// 遍歷資料
-
//備註4------
-
Cursor cur = mysql.rawQuery("SELECT * FROM "
-
+ MySQLiteOpenHelper.TABLE_NAME, null);
-
if (cur != null) {
-
String temp = "";
-
int i = 0;
-
while (cur.moveToNext()) {//直到返回false說明表中到了資料末尾
-
temp += cur.getString(0);
-
// 引數0 指的是列的下標,這裡的0指的是id列
-
temp += cur.getString(1);
-
// 這裡的0相對於當前應該是咱們的text列了
-
i++;
-
temp += " "; // 這裡是我整理顯示格式 ,呵呵~
-
if (i % 3 == 0) // 這裡是我整理顯示格式 ,呵呵~
-
temp += "\n";// 這裡是我整理顯示格式 ,呵呵~
-
}
-
tv.setText(temp);
-
}
-
} else if (v == btn_edit) {// 修改資料
-
// ------------------------控制代碼方式來修改 -------------
-
ContentValues cv = new ContentValues();
-
cv.put(MySQLiteOpenHelper.TEXT, "修改後的資料");
-
mysql.update("himi", cv, "id " + "=" + Integer.toString(3), null);
-
// ------------------------SQL語句來修改 -------------
-
// String UPDATA_DATA =
-
// "UPDATE himi SET text='通過SQL語句來修改資料' WHERE id=1";
-
// db.execSQL(UPDATA_DATA);
-
tv.setText("修改資料成功!點選檢視資料庫查詢");
-
} else if (v == btn_deleteTable) {// 刪除表
-
mysql.execSQL("DROP TABLE himi");
-
tv.setText("刪除表成功!點選檢視資料庫查詢");
-
} else if (v == btn_newTable) {// 新建表
-
String TABLE_NAME = "himi";
-
String ID = "id";
-
String TEXT = "text";
-
String str_sql2 = "CREATE TABLE " + TABLE_NAME + "(" + ID
-
+ " INTEGER PRIMARY KEY AUTOINCREMENT," + TEXT
-
+ " text );";
-
mysql.execSQL(str_sql2);
-
tv.setText("新建表成功!點選檢視資料庫查詢");
-
}
-
// 刪除資料庫:
-
// this.deleteDatabase("himi.db");
-
} catch (Exception e) {
-
tv.setText("操作失敗!");
-
} finally {// 如果try中異常,也要對資料庫進行關閉
-
mysql.close();
-
}
-
}
- }