安卓第四天筆記-Sqlite 1.資料庫的創建運行與更新 1.1.創建一個類繼承SqliteOpenHelper 1.2.創建構造方法 /** * 資料庫創建類 * @author 劉楠 * * 2016-2-20上午10:04:34 */ public class DbSqliteOpenHelp
安卓第四天筆記-Sqlite
1.資料庫的創建運行與更新
1.1.創建一個類繼承SqliteOpenHelper
1.2.創建構造方法
/** * 資料庫創建類 * @author 劉楠 * * 2016-2-20上午10:04:34 */ public class DbSqliteOpenHelper extends SQLiteOpenHelper { /** * * @param context 上下文 * @param name 資料庫的名字如: students.db * @param factory 游標工廠 ,類似JDBC中的ResultSet中的hasNext(); * @param version 資料庫的版本 */ public DbSqliteOpenHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); } /** * 當資料庫被創建時,執行, * 只會執行一次 */ @Override public void onCreate(SQLiteDatabase db) { } /** * 當數據版本升級時執行, * 數據版本只能升不能降 從1開始 * 這裡常用於更改資料庫中的表的結構,如添加列,刪除列,之類的,創建新的表 */ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { } }
1.3.更改構造方法
/** * * @param context 上下文 * @param name 資料庫的名字如: students.db * @param factory 游標工廠 ,類似JDBC中的ResultSet中的hasNext(); * @param version 資料庫的版本 */ public DbSqliteOpenHelper(Context context) { super(context, "student.db", null, 1); } 更改後 /** * * @param context 上下文 * @param name 資料庫的名字如: students.db * @param factory 游標工廠 ,類似JDBC中的ResultSet中的hasNext(); * @param version 資料庫的版本 這裡的版本必須大於0,如果為0就會報錯 */ public DbSqliteOpenHelper(Context context) { super(context, "student.db", null, 1); }
源碼中的解釋,資料庫版本必須大於等於0,否則會拋出異常
將資料庫版本設置為0,運行
不能降版本
1.4.在onCreate方法中創建資料庫表
/** * 當資料庫被創建時,執行, * 只會執行一次 */ @Override public void onCreate(SQLiteDatabase db) { //創建資料庫表 //sql create table students(_id integer primary key, name varchar(30)) db.execSQL("create table students(_id integer primary key, name varchar(30))"); Log.i(TAG, "onCreate 方法執行了"); }
1.5.在Activity中實例化
/** * 資料庫初始化 * @author 劉楠 * * 2016-2-20上午10:27:04 */ public class MainActivity extends Activity { private static final String TAG = "MainActivity"; private DbSqliteOpenHelper helper; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //實例化 helper = new DbSqliteOpenHelper(this); Log.i(TAG, "helper 實例化"); //執行下方的代碼後才會創建資料庫 helper.getWritableDatabase(); } }
創建資料庫後並不會被創建,只有執行了,getReadDatabase或者getWriteDatabase(),
才會執行onCreate中的方法
運行查看LOG
1.6.數據已經創建,查看資料庫
將資料庫文件導出到桌面
SQLite Expert Professional 3打開
1.7.修改資料庫版本,同是添加一列
/** * 當數據版本升級時執行, * 數據版本只能升不能降 從1開始 * 這裡常用於更改資料庫中的表的結構,如添加列,刪除列,之類的,創建新的表 */ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { Log.i(TAG, "onUpgrade 方法執行了"); //sql alter table students add gender varchar(10) //添加列 db.execSQL("alter table students add gender varchar(10)"); }
查看日誌
1.8.導出資料庫中的文件再次查看
列已經添加成功
2.傳統方式操作資料庫
使用sql來操作資料庫
/** * 傳統資料庫操作工具類 * @author 劉楠 * * 2016-2-20下午12:19:16 */ public class StudentDao { private static final String TAG = "StudentDao"; /* * 操作資料庫類 */ private DbSqliteOpenHelper helper; public StudentDao(Context context){ helper = new DbSqliteOpenHelper(context); } /** * 插入方法 * @param name 姓名 * @param gender 性別 * @param stuno 學號 */ public void insert(String name,String gender,String stuno){ //獲取數據 SQLiteDatabase db = helper.getWritableDatabase(); String sql="insert into students values (null,?,?,?)"; //填充占位符 Object [] bindArgs={name,gender,stuno}; //執行SQL db.execSQL(sql, bindArgs); //關閉資料庫連接 db.close(); } /** * 修改更改 update * @param name 姓名 * @param gender 性別 * @param stuno 學號 */ public void update(String name,String gender,String stuno){ //獲取數據 SQLiteDatabase db = helper.getWritableDatabase(); String sql="update students set gender=?,stuno=? where name=?"; //填充占位符 Object [] bindArgs={gender,stuno,name}; //執行SQL db.execSQL(sql, bindArgs); //關閉資料庫連接 db.close(); } /** * 刪除 * @param name 姓名 */ public void delete(String name){ //獲取數據 SQLiteDatabase db = helper.getWritableDatabase(); String sql="delete from students where name=?"; //填充占位符 Object [] bindArgs={name}; //執行SQL db.execSQL(sql, bindArgs); //關閉資料庫連接 db.close(); } /** * 查詢全部 * */ public void getAll(){ //獲取數據 SQLiteDatabase db = helper.getReadableDatabase(); String sql="select _id,name,gender,stuno from students"; //執行SQL Cursor cursor = db.rawQuery(sql, null); while(cursor.moveToNext()){ int _id = cursor.getInt(cursor.getColumnIndex("_id")); String name = cursor.getString(cursor.getColumnIndex("name")); String gender = cursor.getString(cursor.getColumnIndex("gender")); String stuno = cursor.getString(cursor.getColumnIndex("stuno")); Log.i(TAG, "_id:"+_id+"name:"+name+",gender:"+gender+",stuno:"+stuno); } cursor.close(); //關閉資料庫連接 db.close(); } /** * 查詢全部 * */ public void getOne(String stuname){ //獲取數據 SQLiteDatabase db = helper.getReadableDatabase(); String sql="select _id,name,gender,stuno from students where name=?"; String[] selectionArgs = {stuname}; //執行SQL Cursor cursor = db.rawQuery(sql, selectionArgs); while(cursor.moveToNext()){ int _id = cursor.getInt(cursor.getColumnIndex("_id")); String name = cursor.getString(cursor.getColumnIndex("name")); String gender = cursor.getString(cursor.getColumnIndex("gender")); String stuno = cursor.getString(cursor.getColumnIndex("stuno")); Log.i(TAG, "_id:"+_id+"name:"+name+",gender:"+gender+",stuno:"+stuno); } cursor.close(); //關閉資料庫連接 db.close(); } }
測試類
/** * 測試傳統方式資料庫工具類 * @author 劉楠 * * 2016-2-20下午12:48:37 */ public class TestStudentDao extends AndroidTestCase{ private StudentDao studentDao; @Override protected void setUp() throws Exception { studentDao = new StudentDao(getContext()); } /** * 測試插入 */ public void testInsert(){ studentDao.insert("lisi", "man", "heimaAndroid2179"); } /** * 測試插入 */ public void testDelete(){ studentDao.delete("liunan"); } /** * 測試修改 */ public void testUpdate(){ studentDao.update("lisi", "女", "33"); } /** * 測試查詢全部 */ public void testGetAll(){ studentDao.getAll(); } /** * 測試查詢一個 */ public void testGetOne(){ studentDao.getOne("lisi"); } }
3.數據版本判斷與更新
/** * 資料庫創建類 * @author 劉楠 * * 2016-2-20上午10:04:34 */ public class DbSqliteOpenHelper extends SQLiteOpenHelper { private static final String TAG = "DbSqliteOpenHelper"; /** * * @param context 上下文 * @param name 資料庫的名字如: students.db * @param factory 游標工廠 ,類似JDBC中的ResultSet中的hasNext(); * @param version 資料庫的版本 這裡的版本必須大於0,如果為0就會報錯 */ public DbSqliteOpenHelper(Context context) { super(context, "student.db", null,4); } /** * 當資料庫被創建時,執行, * 只會執行一次 * 第二閃運行是就不會執行了 */ @Override public void onCreate(SQLiteDatabase db) { int version = db.getVersion(); Log.i(TAG, "version:"+version); Log.i(TAG, "onCreate 方法執行了"); if(version==0){ db.execSQL("create table students(_id integer primary key autoincrement, name varchar(30),gender varchar(10),stuno varchar(50))"); Log.i(TAG, "version=0執行了"); }else{ //創建資料庫表 //sql create table students(_id integer primary key, name varchar(30)) db.execSQL("create table students(_id integer primary key autoincrement, name varchar(30))"); Log.i(TAG, "version不等0執行了"); } } /** * 當數據版本升級時執行, * 數據版本只能升不能降 從1開始 * 這裡常用於更改資料庫中的表的結構,如添加列,刪除列,之類的,創建新的表 */ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { Log.i(TAG, "onUpgrade 方法執行了"); Log.i(TAG, oldVersion+""); Log.i(TAG, newVersion+""); //算出新 舊版本的差 int difference = newVersion-oldVersion; switch (difference) { case 1: db.execSQL("alter table students add gender varchar(10)"); Log.i(TAG, difference+""); break; case 2: db.execSQL("alter table students add gender varchar(10))"); db.execSQL("alter table students add stuno varchar(50))"); Log.i(TAG, difference+""); break; default: break; } } }
4.使用Android提供的API來操作資料庫
/** * 使用Android中的API來執行操作資料庫 * * @author 劉楠 * * 2016-2-20下午12:19:16 */ public class StudentDao2 { private static final String TAG = "StudentDao2"; /* * 操作資料庫類 */ private DbSqliteOpenHelper helper; public StudentDao2(Context context) { helper = new DbSqliteOpenHelper(context); } /** * 插入方法 * * @param name * 姓名 * @param gender * 性別 * @param stuno * 學號 */ public long insert(String name, String gender, String stuno) { // 獲取數據 SQLiteDatabase db = helper.getWritableDatabase(); // 填充占位符 ContentValues values = new ContentValues(); values.put("name", name); values.put("gender", gender); values.put("stuno", stuno); String nullColumnHack = "values(null,?,?,?)"; // 執行SQL long insert = db.insert("students", nullColumnHack, values); // 關閉資料庫連接 db.close(); return insert; } /** * 修改更改 update * * @param name * 姓名 * @param gender * 性別 * @param stuno * 學號 */ public int update(String name, String gender, String stuno) { // 獲取數據 SQLiteDatabase db = helper.getWritableDatabase(); String sql = "update students set gender=?,stuno=? where name=?"; // 填充占位符 ContentValues values = new ContentValues(); values.put("gender", gender); values.put("stuno", stuno); // 執行SQL int update = db.update("students", values, " name=?", new String[]{name}); // 關閉資料庫連接 db.close(); return update; } /** * 刪除 * * @param name * 姓名 */ public int delete(String name) { // 獲取數據 SQLiteDatabase db = helper.getWritableDatabase(); // 執行SQL int delete = db.delete("students", " name=?", new String[]{name}); // 關閉資料庫連接 db.close(); return delete; } /** * 查詢全部 * */ public void getAll() { // 獲取數據 SQLiteDatabase db = helper.getReadableDatabase(); String sql = "select _id,name,gender,stuno from students"; // 執行SQL Cursor cursor = db.query("students", new String[]{"_id","name","gender","stuno"}, null, null, null, null, null); while (cursor.moveToNext()) { int _id = cursor.getInt(cursor.getColumnIndex("_id")); String name = cursor.getString(cursor.getColumnIndex("name")); String gender = cursor.getString(cursor.getColumnIndex("gender")); String stuno = cursor.getString(cursor.getColumnIndex("stuno")); Log.i(TAG, "_id:" + _id + "name:" + name + ",gender:" + gender + ",stuno:" + stuno); } cursor.close(); // 關閉資料庫連接 db.close(); } /** * 查詢全部 * */ public void getOne(String stuname) { // 獲取數據 SQLiteDatabase db = helper.getReadableDatabase(); // 執行SQL Cursor cursor = db.query("students", new String[]{"_id","name","gender","stuno"}, "name =?", new String[]{stuname}, null, null, null); while (cursor.moveToNext()) { int _id = cursor.getInt(cursor.getColumnIndex("_id")); String name = cursor.getString(cursor.getColumnIndex("name")); String gender = cursor.getString(cursor.getColumnIndex("gender")); String stuno = cursor.getString(cursor.getColumnIndex("stuno")); Log.i(TAG, "_id:" + _id + "name:" + name + ",gender:" + gender + ",stuno:" + stuno); } cursor.close(); // 關閉資料庫連接 db.close(); } }
測試
/** * 測試傳統方式資料庫工具類 * @author 劉楠 * * 2016-2-20下午12:48:37 */ public class TestStudentDao2 extends AndroidTestCase{ private static final String TAG = "TestStudentDao2"; private StudentDao2 studentDao2; @Override protected void setUp() throws Exception { studentDao2 = new StudentDao2(getContext()); } /** * 測試插入 */ public void testInsert(){ long result = studentDao2.insert("lisi", "man", "heimaAndroid2179"); Log.i(TAG, result+""); } /** * 測試插入 */ public void testDelete(){ int delete = studentDao2.delete("aa"); Log.i(TAG, delete+""); } /** * 測試修改 */ public void testUpdate(){ int update = studentDao2.update("lisi", "hh", "33"); Log.i(TAG, update+""); } /** * 測試查詢全部 */ public void testGetAll(){ studentDao2.getAll(); } /** * 測試查詢一個 */ public void testGetOne(){ studentDao2.getOne("gh"); } }
5.創建一個學生信息錄入,使用ListView展示信息baseAdapter
佈局 <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" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <TextView android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_horizontal" android:text="學生信息管理系統" android:textColor="#77ff0000" android:textSize="29sp" /> <EditText android:id="@+id/et_name" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="請輸入學生姓名" /> <!-- 性別 --> <RadioGroup android:id="@+id/rgp" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" > <!-- 性別男 --> <RadioButton android:id="@+id/rb_male" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:checked="true" android:text="male" /> <!-- 性別女 --> <RadioButton android:id="@+id/rb_female" android:layout_width="0dp" android:layout_height="wrap_content" android:layout_weight="1" android:text="female" /> </RadioGroup> <!-- 保存 --> <Button android:id="@+id/btn_save" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="保存" /> <!-- 查詢 --> <Button android:id="@+id/btn_querty" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="查詢全部學生信息" /> <ListView android:id="@+id/lv_item" android:layout_width="match_parent" android:layout_height="match_parent" android:divider="#ff0000" android:dividerHeight="2dp"> </ListView> </LinearLayout>
ListView要使用的佈局
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" > <ImageView android:id="@+id/iv_sex" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_margin="20dp" android:src="@drawable/mr" /> <RelativeLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_margin="10dp" android:layout_toRightOf="@id/iv_sex" > <TextView android:id="@+id/tv_no" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="學號" /> <TextView android:id="@+id/tv_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/tv_no" android:text="姓名" /> <ImageView android:id="@+id/iv_delete" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentRight="true" android:layout_centerVertical="true" android:layout_margin="20dp" android:src="@drawable/delete" /> </RelativeLayout> </RelativeLayout>
資料庫創建類
/** * 資料庫創建類,與維護的類 繼承SQLiteOpenHelper * @author 劉楠 * * 2016-2-20下午6:32:00 */ public class StudentSqliteOpenHelper extends SQLiteOpenHelper { private static final String TAG = "StudentSqliteOpenHelper"; public StudentSqliteOpenHelper(Context context) { super(context, "student.db", null, 2); } /** * 創建資料庫時,執行一次,只執行一次 * 用來創建數據表 */ @Override public void onCreate(SQLiteDatabase db) { Log.i(TAG, "onCreate執行了"); //獲取原來的版本,獲取不到為0 int version = db.getVersion(); if(version==0){ //創建表 String sql= "create table students ( _id integer primary key autoincrement, name varchar(30),gender varchar(10))"; db.execSQL(sql); }else{ //創建表 String sql= "create table students ( _id integer primary key autoincrement, name varchar(30))"; db.execSQL(sql); } } /** * 當資料庫版本發生變化時執行 */ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { Log.i(TAG, "onUpgrade執行了"); switch (oldVersion) { case 1: String sql= "alter table students add gender varchar(10)"; db.execSQL(sql); break; case 2: break; default: break; } } }
實體類
/** * 學生的封裝類 * * @author 劉楠 * * 2016-2-20下午6:31:20 */ public