第一部分 DBHelper部分
/**
* 數據庫Helper類,必須繼承自 SQLiteOpenHelper
* 當一個繼承自 SQLiteOpenHelper 後需要複寫兩個方法,分別是 onCreate() 和 onUpgrade()
* onCreate(): onCreate是在數據庫創建的時候調用的,主要用來初始化數據表結構和插入數據初始化的記錄
* onUpgrade():onUpGrade是在數據庫版本升級的時候調用的,主要用來改變表結構
*
*
* 數據庫幫助類要做的事情特別簡單:
* 1、複寫onCreate() 和 onUpgrade()方法
* 2、在這兩個方法裏面填寫相關的sql語句
*
*
*/
public class DBHelper extends SQLiteOpenHelper {
public DBHelper(Context context) {
/**
* 參數說明:
*
* 第一個參數: 上下文
* 第二個參數:數據庫的名稱
* 第三個參數:null代表的是默認的遊標工廠
* 第四個參數:是數據庫的版本號 數據庫只能升級,不能降級,版本號只能變大不能變小
*/
super(context, "mintest.db", null, 2);
}
/**
* onCreate是在數據庫創建的時候調用的,主要用來初始化數據表結構和插入數據初始化的記錄
*
* 當數據庫第一次被創建的時候調用的方法,適合在這個方法裏面把數據庫的表結構定義出來.
* 所以只有程序第一次運行的時候纔會執行
* 如果想再看到這個函數執行,必須寫在程序然後重新安裝這個app
*/
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("create table contactinfo (id integer primary key autoincrement, name varchar(20), phone varchar(20))");
}
/**
* 當數據庫更新的時候調用的方法
* 這個要顯示出來得在上面的super語句裏面版本號發生改變時纔會 打印 (super(context, "itheima.db", null, 2); )
* 注意,數據庫的版本號只可以變大,不能變小,假設我們當前寫的版本號是3,運行,然後又改成1,運行則報錯。不能變小
* @param db
* @param oldVersion
* @param newVersion
*/
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("alter table contactinfo add account varchar(20)");
}
}
第二部分 DAO工具類
/**
* ContactInjfoDao 數據庫操作類 dao後綴的都是數據庫操作類
*
* 我們這裏的每一個 增刪改查 的方法都通過getWritableDatabase()去實例化了一個數據庫,這裏必須這麼做
* 不客氣抽取 成爲一個成員變量, 否則報錯,若是覺得麻煩可以通過定義方法來置爲null和重新賦值
*
* —— 其實dao類在這裏做得事情特別簡單:
* 1、定義一個構造方法,利用這個方法去實例化一個 數據庫幫助類
* 2、編寫dao類的對應的 增刪改查 方法。
*
*/
public class ContactInjfoDao {
private DBHelper DBhelper;
/**
* dao類需要實例化數據庫Help類,只有得到幫助類的對象我們纔可以實例化 SQLiteDatabase
* @param context
*/
public ContactInjfoDao(Context context){
// 將數據庫打開幫幫助類實例化,然後利用這個對象
// 調用谷歌的api去進行增刪改查
DBhelper = new DBHelper(context);
}
// 增加的方法嗎,返回的的是一個long值
public long addDate(String name,String phone){
// 增刪改查每一個方法都要得到數據庫,然後操作完成後一定要關閉
// getWritableDatabase(); 執行後數據庫文件纔會生成
// 數據庫文件利用DDMS可以查看,在 data/data/包名/databases 目錄下即可查看
SQLiteDatabase sqLiteDatabase = DBhelper.getWritableDatabase();
ContentValues contentValues=new ContentValues();
contentValues.put("name",name);
contentValues.put("phone", phone);
// 返回,顯示數據添加在第幾行
// 加了現在連續添加了3行數據,突然刪掉第三行,然後再添加一條數據返回的是4不是3
// 因爲自增長
long rowid=sqLiteDatabase.insert("contactinfo",null,contentValues);
sqLiteDatabase.close();
return rowid;
}
// 刪除的方法,返回值是int
public int deleteDate(String name){
SQLiteDatabase sqLiteDatabase = DBhelper.getWritableDatabase();
int deleteResult = sqLiteDatabase.delete("contactinfo", "name=?", new String[]{name});
sqLiteDatabase.close();
return deleteResult;
}
/**
* 修改的方法
* @param name
* @param newPhone
* @return
*/
public int updateData(String name,String newPhone){
SQLiteDatabase sqLiteDatabase = DBhelper.getWritableDatabase();
ContentValues contentValues =new ContentValues();
contentValues.put("phone", newPhone);
int updateResult = sqLiteDatabase.update("contactinfo", contentValues, "name=?", new String[]{name});
sqLiteDatabase.close();
return updateResult;
}
/**
* 查詢的方法(查找電話)
* @param name
* @return
*/
public String alterDate(String name){
String phone = null;
SQLiteDatabase readableDatabase = DBhelper.getReadableDatabase();
// 查詢比較特別,涉及到 cursor
Cursor cursor = readableDatabase.query("contactinfo", new String[]{"phone"}, "name=?", new String[]{name}, null, null, null);
if(cursor.moveToNext()){
phone=cursor.getString(0);
}
cursor.close(); // 記得關閉 corsor
readableDatabase.close(); // 關閉數據庫
return phone;
}
}
第三部分 Activity部分
public class MainActivity extends AppCompatActivity {
private EditText mEtName, mEtPhone;
private ContactInjfoDao mDao;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mDao = new ContactInjfoDao(MainActivity.this);
mEtName = (EditText) findViewById(R.id.mEtName);
mEtPhone = (EditText) findViewById(R.id.mEtPhone);
}
//向數據庫中添加數據
public void add(View view){
String name=mEtName.getText().toString().trim();
String phone=mEtPhone.getText().toString().trim();
if(TextUtils.isEmpty(name)||TextUtils.isEmpty(phone)){
Toast.makeText(this,"填寫不完整",Toast.LENGTH_SHORT).show();
return;
}else{
long addLong = mDao.addDate(name, phone);
if(addLong==-1){
Toast.makeText(this,"添加失敗",Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(this,"數據添加在第 "+addLong+" 行",Toast.LENGTH_SHORT).show();
}
}
}
//刪除數據庫中的數據
public void delete(View view){
String name=mEtName.getText().toString().trim();
if(TextUtils.isEmpty(name)){
Toast.makeText(this,"填寫不完整",Toast.LENGTH_SHORT).show();
return;
}else{
int deleteDate = mDao.deleteDate(name);
if(deleteDate==-1){
Toast.makeText(this,"刪除失敗",Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(this,"成功刪除 "+deleteDate+" 條數據",Toast.LENGTH_SHORT).show();
}
}
}
//修改數據中的數據
public void update(View view){
String name=mEtName.getText().toString().trim();
String phone=mEtPhone.getText().toString().trim();
if(TextUtils.isEmpty(name)||TextUtils.isEmpty(phone)){
Toast.makeText(this,"填寫不完整",Toast.LENGTH_SHORT).show();
return;
}else{
int count=mDao.updateData(name, phone);
if(count==-1){
Toast.makeText(this,"更新失敗",Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(this,"數據更新了 "+count+" 行",Toast.LENGTH_SHORT).show();
}
}
}
//查詢數據庫中的數據
public void query(View view){
String name=mEtName.getText().toString().trim();
if(TextUtils.isEmpty(name)){
Toast.makeText(this,"填寫不完整",Toast.LENGTH_SHORT).show();
return;
}else{
String phoneResult = mDao.alterDate(name);
Toast.makeText(this,"手機號碼爲: "+phoneResult,Toast.LENGTH_SHORT).show();
}
}
}
第四部分 佈局部分
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity" >
<EditText
android:id="@+id/mEtName"
android:hint="請輸入聯繫人的姓名"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
</EditText>
<EditText
android:id="@+id/mEtPhone"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="請輸入聯繫人的電話"
android:inputType="phone" />
<Button
android:onClick="add"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="添加" />
<Button
android:onClick="delete"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="刪除" />
<Button
android:onClick="update"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="修改" />
<Button
android:onClick="query"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="查詢" />
</LinearLayout>