簡單介紹一下Android系統內置輕便又功能強大的嵌入式數據庫--SQLite。
SQLite是D.Richard Hipp用C語言編寫的開源嵌入式數據庫引擎,它是一款輕型的數據庫,是遵守ACID的關系型數據庫管理系統,它的設計目標是嵌入式的,而且由於其占用資源低(占用內存只需幾百K)、處
理速度快等特點,目前許多嵌入式產品中都使用了它,其中就包括大名鼎鼎的iOS和Android移動操作系統。SQLite能夠支持Windows/Linux/Unix等等主流的操作系統,同時能夠跟很多程序語言相結合,比如 Tcl、
C#、PHP、Java等,還有ODBC接口,同樣比起Mysql、PostgreSQL這兩款開源世界著名的數據庫管理系統來講,它的處理速度比他們都快。
SQLite數據庫的特點:
1.輕量級:使用 SQLite 只需要帶一個動態庫,就可以享受它的全部功能,而且那個動態庫的尺寸想當小。
2.獨立性:SQLite 數據庫的核心引擎不需要依賴第三方軟件,也不需要所謂的“安裝”。
3.隔離性:SQLite 數據庫中所有的信息(比如表、視圖、觸發器等)都包含在一個文件夾內,方便管理和維護。
4.跨平台:SQLite 目前支持大部分操作系統,不至電腦操作系統更在眾多的手機系統也是能夠運行,比如:Android和IOS。
5.多語言接口: SQLite 數據庫支持多語言編程接口。
6.安全性:SQLite 數據庫通過數據庫級上的獨占性和共享鎖來實現獨立事務處理。這意味着多個進程可以在同一時間從同一數據庫讀取數據,但只能有一個可以寫入數據。
接下來就在Android中創建一個自己的SQLite數據庫,完整代碼如下:
DBHelper.java:
1 public class DBHelper extends SQLiteOpenHelper { 2 3 private static final String DATABASE_NAME = "test.db"; //數據庫名字 4 private static final int DATABASE_VERSION = 1 ; //數據庫版本號 5 6 public DBHelper(Context context){ 7 super(context,DATABASE_NAME,null,DATABASE_VERSION); 8 } 9 10 11 /** 12 * 創建數據庫表:person 13 * _id為主鍵,自增 14 * **/ 15 @Override 16 public void onCreate(SQLiteDatabase sqLiteDatabase) { 17 Log.i("TAG:","創建person數據庫表!"); 18 sqLiteDatabase.execSQL("CREATE TABLE IF NOT EXISTS person(_id INTEGER PRIMARY KEY AUTOINCREMENT," + 19 " name VARCHAR,info TEXT)"); 20 } 21 22 @Override 23 public void onUpgrade(SQLiteDatabase sqLiteDatabase,int oldVersion,int newVersion) { 24 25 } 26 27 @Override 28 public void onOpen(SQLiteDatabase sqLiteDatabase){ 29 super.onOpen(sqLiteDatabase); 30 } 31 }
DBManager.java:
1 public class DBManager { 2 3 DBHelper helper; 4 SQLiteDatabase sqLiteDatabase; 5 6 public DBManager(Context context){ 7 helper = new DBHelper(context); 8 sqLiteDatabase = helper.getReadableDatabase(); 9 } 10 11 /** 12 * execSQL()方法可以執行insert,update,delete語句 13 * 實現對數據庫的 增,刪,改 功能 14 * sql為操作語句 , bindArgs為操作傳遞參數 15 * **/ 16 public boolean updateSQLite(String sql , Object [] bindArgs){ 17 boolean isSuccess = false; 18 try { 19 sqLiteDatabase.execSQL( sql , bindArgs ); 20 isSuccess = true; 21 }catch (Exception e){ 22 e.printStackTrace(); 23 }finally { 24 if (sqLiteDatabase!=null){ 25 sqLiteDatabase.close(); 26 } 27 Log.i("TAG:","數據插入數據庫中狀態:" + isSuccess); 28 } 29 return isSuccess; 30 } 31 32 /** 33 * rawQuery()方法可以執行select語句 34 * 實現查詢功能 35 * sql為操作語句 , bindArgs為操作傳遞參數 36 * **/ 37 public ArrayList<HashMap<String , String>> querySQLite(String sql , String [] bindArgs){ 38 ArrayList<HashMap<String ,String>> list = new ArrayList<HashMap<String, String>>(); 39 40 /**Cursor是結果集游標,使用Cursou.moveToNext()方法可以從當前行移動到下一行**/ 41 Cursor cursor = sqLiteDatabase.rawQuery(sql , bindArgs); 42 int clos_len = cursor.getColumnCount(); //獲取數據所有列數 43 44 Log.i("TAG:","querySQLite()方法中獲得總列數clos_len:" + clos_len); 45 46 boolean isfals = cursor.moveToNext(); 47 Log.i("TAG:","isfals值為:" + isfals); 48 49 while(cursor.moveToNext()) { //循環表格中的每一行 50 Log.i("TAG:","進入到while循環中"); 51 52 HashMap<String , String> map = new HashMap<>(); 53 for(int i = 0;i<clos_len;i++){ //循環表格中的每一列 54 String clos_name = cursor.getColumnName(i); //從給定的索引i返回列名 55 String clos_value = cursor.getString(cursor.getColumnIndex(clos_name));//返回指定的名稱,沒有就返回-1 56 if(clos_value==null){ 57 clos_value = ""; 58 } 59 60 Log.i("TAG:","while循環下面的for循環拿到的數據clos_value為:" 61 + cursor.getString(cursor.getColumnIndex(clos_name))); 62 63 map.put(clos_name , clos_value); 64 } 65 list.add(map); 66 } 67 return list; 68 } 69 }
SQLFunction.java:
1 public class SQLFunction { 2 3 static DBHelper helper; 4 5 6 public static void initTable(Context context){ 7 helper = new DBHelper(context); 8 helper.getReadableDatabase(); 9 } 10 11 /**【插入數據】**/ 12 public static void insert(Context context , Object [] data){ 13 14 Log.i("TAG:","插入數據到數據庫表:person中:"+data.toString()); 15 16 DBManager sqlManager = new DBManager(context); 17 helper = new DBHelper(context); 18 helper.getWritableDatabase(); 19 String sql = "insert into person ( name , info ) values ( ? , ?)"; 20 Object [] bindArgs = data; 21 sqlManager.updateSQLite( sql , bindArgs ); 22 } 23 24 25 /**【模糊查詢】**/ 26 public static ArrayList<HashMap<String ,String>>query(Context context,String where1 ,String where2){ 27 DBManager sqlManager = new DBManager(context); 28 ArrayList<HashMap<String ,String>> list = new ArrayList<>(); 29 String sql = "select * from person where name like ? and info like ?"; 30 if(where1 == null){ 31 list = sqlManager.querySQLite(sql,new String[] {"%","%"}); 32 }else{ 33 where1 = "%" + where1 + "%"; 34 where2 = "%" + where2 + "%"; 35 list = sqlManager.querySQLite(sql,new String [] { where1 , where2 } ); 36 } 37 38 Log.i("TAG:","查詢完畢,返回數據:" + list.size()); 39 40 return list; 41 } 42 43 /**【刪除數據】**/ 44 public static void delete(Context context , Object[] data){ 45 DBManager sqlmanager = new DBManager(context); 46 String sql = "delete from person where _id = ? "; 47 sqlmanager.updateSQLite(sql , data); 48 } 49 50 /**【更新數據】**/ 51 public static void update(Context context , Object[]data){ 52 helper = new DBHelper(context); 53 helper.getReadableDatabase(); 54 DBManager sqlManager = new DBManager(context); 55 String sql = "update person set name=? , info=? where _id=?"; 56 sqlManager.updateSQLite(sql,data); 57 } 58 59 }
我這里的數據都是用Log.i();方式輸出,布局文件簡單加載個button按鈕:
1 <LinearLayout 2 xmlns:android="http://schemas.android.com/apk/res/android" 3 xmlns:app="http://schemas.android.com/apk/res-auto" 4 xmlns:tools="http://schemas.android.com/tools" 5 android:layout_width="match_parent" 6 android:layout_height="wrap_content" 7 android:orientation="vertical" 8 android:layout_gravity="center" 9 android:gravity="center" 10 tools:context="com.hs.example.exampleapplication.MainActivity"> 11 12 <LinearLayout 13 android:layout_width="match_parent" 14 android:layout_height="wrap_content" 15 android:orientation="horizontal" 16 android:gravity="center"> 17 18 <Button 19 android:id="@+id/btn_sql" 20 android:layout_width="0dp" 21 android:layout_weight="1" 22 android:layout_height="match_parent" 23 android:text="數據庫操作"/> 24 </LinearLayout> 25 26 </LinearLayout>
MainActivity.java:
1 public class MainActivity extends AppCompatActivity implements View.OnClickListener{ 2 Button btn_sql; 3 4 @Override 5 protected void onCreate(Bundle savedInstanceState) { 6 super.onCreate(savedInstanceState); 7 setContentView(R.layout.activity_main); 8 9 /**【初始化數據庫】**/ 10 SQLFunction.initTable(MainActivity.this); 11 12 /**【動態申請sdCard讀寫權限】**/ 13 //DocumentTool.verifyStoragePermissions(MainActivity.this); 14 15 btn_sql = this.findViewById(R.id.btn_sql); 16 btn_sql.setOnClickListener(this); 17 18 } 19 20 public void onClick(View view) { 21 int id = view.getId(); 22 switch (id){ 23 case R.id.btn_sql: 24 DB_i_u_d_s(); 25 break; 26 } 27 } 28 29 /**【操作數據庫的方法】**/ 30 private void DB_i_u_d_s(){ 31 SQLFunction function = new SQLFunction(); 32 33 /** 34 Log.i("TAG:","插入數據!"); 35 Object[] data = {"root","123456"}; 36 function.insert(MainActivity.this,data); 37 */ 38 39 /** 40 * Log.i("TAG:","通過id來修改數據!"); 41 *String name = "sale"; 42 *String info = "TestSale"; 43 *int _id = 7; 44 *Object[]data = {name,info,_id}; 45 *function.update(MainActivity.this,data); 46 * */ 47 48 /** 49 * Log.i("TAG:","通過id來刪除數據!"); 50 *int d_id = 2; 51 *Object[] did = {d_id}; 52 *function.delete(MainActivity.this,did); 53 * */ 54 Log.i("TAG:","查詢數據!"); 55 String where1 = null; 56 String where2 = null; 57 ArrayList<HashMap<String ,String>> list = new ArrayList<>(); 58 list = function.query(MainActivity.this,where1,where2); 59 if(list!=null){ 60 for(int i = 0 ; i<list.size();i++){ 61 Log.i("TAG:","從數據庫中拿到的數據 _ID為:" +list.get(i).get("_id")); 62 Log.i("TAG:","從數據庫中拿到的數據name為:" + list.get(i).get("name")); 63 Log.i("TAG:","從數據庫中拿到的數據info為:" + list.get(i).get("info")); 64 } 65 }else { 66 Log.i("TAG:","從數據庫中沒有拿到數據!"); 67 } 68 } 69 }
執行效果: