Sqlite
使用
- 創(chuàng)建數(shù)據(jù)庫(kù)
- 創(chuàng)建表
Android為了讓我們能方便的管理數(shù)據(jù)庫(kù)椭盏,提供了一個(gè)SQLiteOpenHelper
幫助類随静,借助這個(gè)類就可以非常簡(jiǎn)單地對(duì)數(shù)據(jù)庫(kù)進(jìn)行創(chuàng)建和升級(jí)基跑,所以我們需要先繼承 SQLiteOpenHelper
寫一個(gè) DatabaseHelper
,代碼如下:
public class DatabaseHelper extends SQLiteOpenHelper{
/**
* 先把建表語句用字符串變量存起(也可以不存报辱,直接在函數(shù)里寫召噩,但這樣規(guī)范些)
*/
public static final String CREATE_BOOK = "create table Book (" +
"id integer primary key autoincrement," +
"author text," +
"price real," +
"pages integer," +
"name text)";
public static final String CREATE_CATEGORY = "create table Category(" +
"id integer primary key autoincrement," +
"category_name text," +
"category_code integer)";
private Context mContext;
public DatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
this.mContext = context;
Log.d(LogUtil.TAG,"DatabaseHelper");
}
/**
* 第一次創(chuàng)建數(shù)據(jù)庫(kù)時(shí)執(zhí)行父虑,如果數(shù)據(jù)庫(kù)已經(jīng)存在该酗,則不在執(zhí)行
* @param sqLiteDatabase
*/
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
sqLiteDatabase.execSQL(CREATE_BOOK);
sqLiteDatabase.execSQL(CREATE_CATEGORY);
Log.d(LogUtil.TAG,"onCreate");
Toast.makeText(mContext,"Created succeded",Toast.LENGTH_SHORT).show();
}
/**
* 此方法升級(jí)數(shù)據(jù)庫(kù)時(shí)會(huì)被回調(diào)
* @param sqLiteDatabase
* @param i
* @param i1
*/
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
Log.d(LogUtil.TAG,"onUpgrade");
sqLiteDatabase.execSQL("drop table if exists Book");
sqLiteDatabase.execSQL("drop table if exists Category");
onCreate(sqLiteDatabase);
}
/**
* 每次打開數(shù)據(jù)庫(kù)時(shí)都會(huì)執(zhí)行,也就是
* DbHelper.getWritableDatabase() 或 mDbHelper.getReadableDatabase()
* @param db
*/
@Override
public void onOpen(SQLiteDatabase db) {
super.onOpen(db);
Log.d(LogUtil.TAG,"onOpen");
}
}
上面的注釋寫的比較詳細(xì)士嚎,把每個(gè)方法都寫到了呜魄,相信應(yīng)該能看懂。
然后需要調(diào)用創(chuàng)建DatabaseHelper
的實(shí)例莱衩,然后通過DatabaseHelper
來獲得SQLiteDatabase
實(shí)例爵嗅,我們就可以使用返回的SQLiteDatabase
實(shí)例來操作數(shù)據(jù)庫(kù)了
//參數(shù)一:Context
//參數(shù)二:數(shù)據(jù)庫(kù)名稱
//參數(shù)三:允許我們?cè)诓樵償?shù)據(jù)時(shí)返回一個(gè)自定義的Cursor,一般用不到笨蚁,傳入null
//參數(shù)四:版本號(hào)
DatabaseHelper mDbHelper = new DatabaseHelper(this,"BookStore.db",null,2);
//一般是getWritableDatabase()
mDb = mDbHelper.getWritableDatabase() 或 mDbHelper.getReadableDatabase()
- 升級(jí)數(shù)據(jù)庫(kù)
//修改版本號(hào)就行
DatabaseHelper mDbHelper = new DatabaseHelper(this,"BookStore.db",null,3); // 下次升級(jí)就把 3 改成更大的
- 增加數(shù)據(jù)(insert)
//用contentValues來保存你需要存儲(chǔ)的數(shù)據(jù)
ContentValues contentValues = new ContentValues();
contentValues.put("pages",pages);
contentValues.put("price",price);
//參數(shù)一:表名
//參數(shù)二:用于在未指定添加數(shù)據(jù)的情況下給某些可為空的列自動(dòng)賦值null睹晒,一般用不到,設(shè)為null
//參數(shù)三:ContentValues對(duì)象
mDb.insert("Book",null,contentValues);
//清空contentValues
contentValues.clear();
- 查詢數(shù)據(jù)(select)
SQLiteDatabase
中提供了一個(gè)query()
方法用于對(duì)數(shù)據(jù)進(jìn)行查詢赚窃,這個(gè)方法參數(shù)比較復(fù)雜册招,最短的一個(gè)也需要傳7個(gè)參數(shù),界面來介紹一個(gè)7個(gè)參數(shù)的含義:
- table :指定查詢的表名
- columns :指定查詢的列名
- selection :指定where的約束條件
- selectionArgs :為where重的占位符提供具體的值
- groupBy :指定需要group by的列
- having :對(duì)group by后的結(jié)果進(jìn)一步約束
- orderBy :指定查詢結(jié)果的排列方式
以下是查詢數(shù)據(jù)的代碼片段:
mSelect.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (mDb == null){
mDb = mDbHelper.getWritableDatabase(); //創(chuàng)建或打開數(shù)據(jù)庫(kù)
}
name = mEdit_Name.getText().toString();
Cursor cursor = mDb.query("Book",null,"name = ?",new String[]{name},null,null,null);
if (cursor.moveToFirst()){
do {
name = cursor.getString(cursor.getColumnIndex("name"));
author = cursor.getString(cursor.getColumnIndex("author"));
pages = cursor.getString(cursor.getColumnIndex("pages"));
price = cursor.getString(cursor.getColumnIndex("price"));
mTv_Name.setText(name);
mTv_Author.setText(author);
mTv_Pages.setText(pages);
mTv_Price.setText(price);
}while (cursor.moveToNext());
}
}
});
- 更新數(shù)據(jù)(update)
update()
函數(shù)有4個(gè)參數(shù)勒极,和query()
的大部分相同
- table:指定查詢的表名
- values:刷新的值
- whereClause:指定where的約束條件
- whereArgs:為where重的占位符提供具體的值
以下是更新數(shù)據(jù)的代碼片段:
mUpdate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (mDb == null){
mDb = mDbHelper.getWritableDatabase(); //創(chuàng)建或打開數(shù)據(jù)庫(kù)
}
name = mEdit_Name.getText().toString();
author = mEdit_Author.getText().toString();
pages = mEdit_Pages.getText().toString();
price = mEdit_Price.getText().toString();
if (!"".equals(author))contentValues.put("author",author);
if (!"".equals(pages))contentValues.put("pages",pages);
if (!"".equals(price))contentValues.put("price",price);
mDb.update("Book",contentValues,"name = ?",new String[]{name});
contentValues.clear();
}
});
- 刪除數(shù)據(jù)(delete)
delete()
方法有3個(gè)參數(shù)是掰,和上面的一樣,就不細(xì)說了辱匿,代碼如下:
mDelete.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (mDb == null){
mDb = mDbHelper.getWritableDatabase(); //創(chuàng)建或打開數(shù)據(jù)庫(kù)
}
name = mEdit_Name.getText().toString();
mDb.delete("Book","name = ?",new String[]{name});
}
});
問題:
- getReadableDatabase() 和 getWritableDatabase() 的區(qū)別键痛?
- 兩個(gè)方法都可以創(chuàng)建或打開一個(gè)現(xiàn)有的數(shù)據(jù)庫(kù)(如果數(shù)據(jù)庫(kù)已存在則直接打開,否則創(chuàng)建一個(gè)新的數(shù)據(jù)庫(kù))匾七,并返回一個(gè)可對(duì)數(shù)據(jù)庫(kù)進(jìn)行讀寫操作的對(duì)象
- 當(dāng)數(shù)據(jù)庫(kù)不可寫入時(shí)(比如磁盤滿了)絮短,getReadableDatabase()方法返回的對(duì)象將以只讀的方式去打開數(shù)據(jù)庫(kù),而getWritableDatabase()方法則將出現(xiàn)異常昨忆。
File
適用場(chǎng)景
文件存儲(chǔ)是Android中最基本的一種數(shù)據(jù)存儲(chǔ)方式丁频,它不對(duì)
存儲(chǔ)的內(nèi)容進(jìn)行任何的格式化處理
,所有的數(shù)據(jù)都是原封不動(dòng)
的保存到文件中,所以它適合存儲(chǔ)一些簡(jiǎn)單的文本數(shù)據(jù)或二進(jìn)制數(shù)據(jù)
席里。
使用
保存數(shù)據(jù)
openFileOutput()
方法可以指定兩種模式:
MODE_PRIVATE
:是默認(rèn)的操作模式叔磷,表示當(dāng)指定同樣文件名的時(shí)候,所寫的內(nèi)容將會(huì)覆蓋原文件中的內(nèi)容奖磁。
MODE_APPEND
:表示如果該文件已存在改基,就往里面追加內(nèi)容。
private void sava(String inputText){
FileOutputStream out = null;
BufferedWriter writer = null;
try {
out = openFileOutput("data", Context.MODE_PRIVATE);
writer = new BufferedWriter(new OutputStreamWriter(out));
writer.write(inputText);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (writer != null){
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
讀取數(shù)據(jù)
private String load(){
FileInputStream input = null;
BufferedReader reader = null;
StringBuilder content = new StringBuilder();
try {
input = openFileInput("data");
reader = new BufferedReader(new InputStreamReader(input));
String line = "";
while ((line = reader.readLine()) != null){
content.append(line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null){
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return content.toString();
}
Sharedpreference
不同于文件存儲(chǔ)咖为,Sharedpreference是使用鍵值對(duì)的方式來存儲(chǔ)數(shù)據(jù)的秕狰,Sharedpreference還支持多種不同的數(shù)據(jù)類型存儲(chǔ),存的是String取出也是String躁染,存進(jìn)去的是整形鸣哀,讀取出來也是整形。
使用
獲取Sharedpreference對(duì)象
Android中提供了 3 種方法用于得到SharedPreferences對(duì)象
-
Context類
中的getSharedPreferences()
方法
此方法接收兩個(gè)參數(shù):
第一個(gè)參數(shù)用于指定Sharedpreference的名稱褐啡,如果指定的文件不存在則會(huì)創(chuàng)建一個(gè)
第二個(gè)用于指定操作模式诺舔,目前只有
MODE_PRIVATE
這一模式可選鳖昌,是默認(rèn)的模式备畦,和直接傳入0
的效果一樣,表示只有當(dāng)前的應(yīng)用程序才可以對(duì)這個(gè)Sharedpreference文件進(jìn)行讀寫
Activity類
中的getPreferences()
方法
和方法1
類似许昨,不過只接收一個(gè)操作模式參數(shù)懂盐,因?yàn)槭褂眠@個(gè)方法時(shí)會(huì)自動(dòng)將當(dāng)前活動(dòng)的類名作為Sharedpreference
的文件名PreferenceManager 類
中的
getDefaultSharePreferences()
方法
使用步驟
保存數(shù)據(jù):
(1)、獲取Sharedpreference對(duì)象
(2)糕档、調(diào)用Sharedpreference對(duì)象的 edit()
方法來獲取一個(gè) Sharedpreference.Editor對(duì)象
莉恼。
(3)、向Sharedpreference.Editor對(duì)象中添加數(shù)據(jù)
速那,比如putBoolean()
俐银、putString()
方法等等
(4)、調(diào)用apply()
方法將添加的數(shù)據(jù)提交
端仰,從而完成數(shù)據(jù)存儲(chǔ)操作
示例代碼:
SharedPreferences.Editor editor = getSharedPreferences("data",MODE_PRIVATE).edit();
editor.putString("name",mEdit_Name.getText().toString());
editor.putString("age",mEdit_Age.getText().toString());
editor.apply();
取出數(shù)據(jù):
(1)捶惜、獲取Sharedpreference對(duì)象
(2)、調(diào)用Sharedpreference對(duì)象的 getString()
等方法獲取數(shù)據(jù)
示例代碼:
SharedPreferences preferences = getSharedPreferences("data",MODE_PRIVATE);
mTv_Name.setText(preferences.getString("name",""));
mTv_Age.setText(preferences.getString("age",""));