Android數(shù)據(jù)存儲(chǔ)之SQLite使用
SQLite是一款開源的、嵌入式關(guān)系型數(shù)據(jù)庫,第一個(gè)版本Alpha發(fā)布于2000年。SQLite在便攜性、易用性、緊湊性、高效性和可靠性方面有著突出的表現(xiàn)。
在Android中創(chuàng)建的SQLite數(shù)據(jù)庫存儲(chǔ)在:/data/data/<包名>/databases/目錄下。
主要特點(diǎn):
-輕量級(jí)
-獨(dú)立性,沒有不依賴,無需安裝
-跨平臺(tái),支持眾多操作系統(tǒng)
-支持高達(dá)2TB大小的數(shù)據(jù)庫
-每個(gè)數(shù)據(jù)庫以單個(gè)文件的形式存在
-以B-Tree的數(shù)據(jù)結(jié)構(gòu)形式存儲(chǔ)在硬盤
SQLite的數(shù)據(jù)類型:
SQLite支持NULL、INTEGER、REAL、TEXT和BLOB數(shù)據(jù)類型
分別代表:空值、整型值、浮點(diǎn)值、字符串值、二進(jìn)制對象。
動(dòng)態(tài)數(shù)據(jù)類型(弱引用):
當(dāng)某個(gè)值插入到數(shù)據(jù)庫中時(shí),SQLite將會(huì)檢測它的數(shù)據(jù)類型,如果該類型與關(guān)聯(lián)的列不匹配,SQLite則會(huì)嘗試將該值轉(zhuǎn)換成該列的類型,如果不能轉(zhuǎn)換,則該值將作為本身的類型存儲(chǔ)。
在Android中使用SQLite主要涉及兩個(gè)類:
SQLiteDatabase和SQLiteOpenHelper,下面對這兩個(gè)類進(jìn)行主要的分析。
SQLiteDatabase
這個(gè)類提供了一些管理SQLite數(shù)據(jù)庫的方法,比如創(chuàng)建、刪除、執(zhí)行SQL命令,和執(zhí)行其他常見的數(shù)據(jù)庫管理任務(wù)的方法。每個(gè)程序的數(shù)據(jù)庫名字是唯一的。
常用方法:
db.execSQL(String sql) //執(zhí)行任何的SQL語句
db.insert(String table,String nullColumnHack,ContentValues values) //插入記錄
db.delete(String table,String whereClause,String[] whereArgs)//刪除記錄
db.update(String table,ContentValues values,String whereClause,String[] whereArgs)//更新記錄
db.query(String table,String[] columns,String selection,String[] selectionArgs,String groupBy,String having,String orderBy)//查詢記錄
db.rawQuery(String sql,String[] selectionArgs)//通過sql語句查詢記錄
下面是一個(gè)簡單操作SQLite數(shù)據(jù)庫的示例:
public class MainActivity extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //每個(gè)程序都有自己的數(shù)據(jù)庫 //通過openOrCreateDatabase來打開或創(chuàng)建一個(gè)數(shù)據(jù)庫,返回SQLiteDatabase對象 /** * openOrCreateDatabase(String name,int mode,SQLiteDatabase.CursorFactory factory) * name: 數(shù)據(jù)庫名 * mode: 數(shù)據(jù)庫權(quán)限,MODE_PRIVATE為本應(yīng)用程序私有,MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE分別為全局可讀和可寫。 * factory: 可以用來實(shí)例化一個(gè)cusor對象的工廠類 */ SQLiteDatabase db = openOrCreateDatabase("user.db",MODE_PRIVATE,null); //創(chuàng)建一個(gè)表 db.execSQL("create table if not exists userTb (" + "_id integer primary key," + "name text not null,age integer not null," + "sex text not null)"); //向表中插入記錄 db.execSQL("insert into userTb (name,age,sex) values ('張三',18,'女')"); db.execSQL("insert into userTb (name,age,sex) values ('李四',19,'男')"); db.execSQL("insert into userTb (name,age,sex) values ('王五',20,'女')"); //Cursor為查詢結(jié)果對象,類似于JDBC中的ResultSet Cursor queryResult = db.rawQuery("select * from userTb", null); if (queryResult != null) { while (queryResult.moveToNext()) { Log.i("info", "id: " + queryResult.getInt(queryResult.getColumnIndex("_id")) + " 姓名: " + queryResult.getString(queryResult.getColumnIndex("name")) + " 年齡: " + queryResult.getInt(queryResult.getColumnIndex("age")) + " 性別: " + queryResult.getString(queryResult.getColumnIndex("sex"))); } //關(guān)閉游標(biāo)對象 queryResult.close(); } //關(guān)閉數(shù)據(jù)庫 db.close(); } }
當(dāng)執(zhí)行完openOrCreateDatabase("user.db",MODE_PRIVATE,null)后,會(huì)在/data/data/<包名>/databases/目錄下創(chuàng)建一個(gè)數(shù)據(jù)庫文件,打開DDMS可以查看。也可以將其導(dǎo)出,使用navigate等工具打開查看里面的數(shù)據(jù)。
另外,上述示例對記錄的操作是使用execSQL()方法通過原生的SQL語句進(jìn)行的,當(dāng)然也可以使用上面介紹的SQLiteDatabase常用的方法來操作,如insert()、delete()、update()、query()等方法。但是需要注意的是,以插入記錄舉例,當(dāng)數(shù)據(jù)量不大時(shí),通過execSQL()使用SQL語句進(jìn)行插入與使用insert()方法插入記錄的效率是差不多的,但是如果數(shù)據(jù)量比較大,那么使用前者比使用后者的效率明顯高出很多。
SQLiteOpenHelper
這個(gè)類為SQLiteDatabase的幫助類,主要用于管理數(shù)據(jù)庫的創(chuàng)建與版本更新。SQLiteHelper是一個(gè)抽象類,一般通過創(chuàng)建一個(gè)繼承自它的子類并重寫onCreat()和onUpgrade()方法進(jìn)行使用。
-onCreat(SQLiteDatabase db) //首次創(chuàng)建數(shù)據(jù)庫時(shí)調(diào)用,一般用于建表等操作。
-onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion)//當(dāng)升級(jí)數(shù)據(jù)庫版本時(shí)調(diào)用
下面是使用SQLiteOpenHelper的一個(gè)簡單示例:
創(chuàng)建一個(gè)繼承自SQLiteOpenHelper的子類
public class SQLiteHelper extends SQLiteOpenHelper { /** * context:上下文對象 * name:數(shù)據(jù)庫名 */ public SQLiteHelper(Context context, String name) { super(context, name, null, 1); } //首次創(chuàng)建數(shù)據(jù)庫的時(shí)候調(diào)用,一般進(jìn)行建表或某些初始化的操作 @Override public void onCreate(SQLiteDatabase db) { //建表 db.execSQL("create table if not exists userTb (" + "_id integer primary key," + "name text not null,age integer not null," + "sex text not null)"); } //當(dāng)數(shù)據(jù)庫版本升級(jí)時(shí)自動(dòng)調(diào)用 @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } }
然后就可以通過SQLiteHelper的實(shí)例獲取一個(gè)SQLiteDatabase對象,進(jìn)而對數(shù)據(jù)庫進(jìn)行一系列的操作了。
public class MainActivity2 extends AppCompatActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main2); //創(chuàng)建一個(gè)SQLiteHelper對象 SQLiteHelper helper = new SQLiteHelper(MainActivity2.this,"stu.db"); //使用getWritableDatabase()或getReadableDatabase()方法獲得SQLiteDatabase對象 SQLiteDatabase db = helper.getWritableDatabase(); //插入記錄 db.execSQL("insert into userTb (name,age,sex) values ('張三',18,'女')"); db.execSQL("insert into userTb (name,age,sex) values ('李四',19,'男')"); db.execSQL("insert into userTb (name,age,sex) values ('王五',20,'女')"); //獲取游標(biāo)對象 Cursor queryResult = db.rawQuery("select * from userTb", null); if (queryResult != null) { //打印所有記錄 while (queryResult.moveToNext()) { Log.i("info", "id: " + queryResult.getInt(queryResult.getColumnIndex("_id")) + " 姓名: " + queryResult.getString(queryResult.getColumnIndex("name")) + " 年齡: " + queryResult.getInt(queryResult.getColumnIndex("age")) + " 性別: " + queryResult.getString(queryResult.getColumnIndex("sex"))); } //關(guān)閉游標(biāo)對象 queryResult.close(); } //關(guān)閉數(shù)據(jù)庫 db.close(); } }
- Android使用Sqlite存儲(chǔ)數(shù)據(jù)用法示例
- 詳解Android數(shù)據(jù)存儲(chǔ)—使用SQLite數(shù)據(jù)庫
- Android SQLite數(shù)據(jù)庫徹底掌握數(shù)據(jù)存儲(chǔ)
- Android SQLite數(shù)據(jù)庫增刪改查操作的使用詳解
- Android使用SQLite數(shù)據(jù)庫的簡單實(shí)例
- android創(chuàng)建數(shù)據(jù)庫(SQLite)保存圖片示例
- android開發(fā)教程之listview顯示sqlite數(shù)據(jù)
- Android中操作SQLite數(shù)據(jù)庫快速入門教程
- Android創(chuàng)建和使用數(shù)據(jù)庫SQLIte
- Android SQLite數(shù)據(jù)庫增刪改查操作的案例分析
- Android操作SQLite數(shù)據(jù)庫(增、刪、改、查、分頁等)及ListView顯示數(shù)據(jù)的方法詳解
- Android開發(fā)之使用SQLite存儲(chǔ)數(shù)據(jù)的方法分析
相關(guān)文章
Android 如何獲取手機(jī)總內(nèi)存和可用內(nèi)存等信息
這篇文章主要介紹了Android系統(tǒng)檢測程序內(nèi)存占用各種方法,并對內(nèi)存信息的詳細(xì)介紹,需要的朋友可以參考下2016-07-07android-使用環(huán)信SDK開發(fā)即時(shí)通信功能(附源碼下載)
本篇文章主要介紹了android-使用環(huán)信SDK開發(fā)即時(shí)通信功能,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。2016-12-12android使用include調(diào)用內(nèi)部組件的方法
這篇文章主要介紹了android使用include調(diào)用內(nèi)部組件的方法,涉及Android組件調(diào)用的相關(guān)技巧,需要的朋友可以參考下2015-05-05Android自定義View之自定義評價(jià)打分控件RatingBar實(shí)現(xiàn)自定義星星大小和間距
Android開發(fā)中,我們經(jīng)常會(huì)用到對商家或者商品的評價(jià),運(yùn)用星星進(jìn)行打分。這篇文章介紹了Android自定義View之自定義評價(jià)打分控件RatingBar可以自定義星星大小和間距的相關(guān)資料,感興趣的朋友一起看看吧2016-10-10Android6.0 storage目錄sd卡存儲(chǔ)的路徑創(chuàng)建詳解
這篇文章主要介紹了Android6.0 storage目錄sd卡存儲(chǔ)的路徑創(chuàng)建的相關(guān)資料,需要的朋友可以參考下2017-01-01Android性能優(yōu)化之Bitmap圖片優(yōu)化詳解
在Android項(xiàng)目的imageview中使用大圖bitmap時(shí)會(huì)占據(jù)很大的內(nèi)存,而且在很多時(shí)候我們并不需要顯示原圖那么大的圖片, 所以我們需要對圖片進(jìn)行優(yōu)化,這篇文章主要介紹了Android性能優(yōu)化之Bitmap圖片優(yōu)化的相關(guān)資料,需要的朋友們下面來一起看看吧。2017-04-04