上一篇文章介紹了sqlite數據庫的建立,以及數據的訪問,本文將主要介紹數據庫的增刪改查.html
下面直接看代碼:java
MyDBHelper.java(建立數據庫,添加一列phone)android
package com.amos.android_database; import android.content.Context; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log; /** * Created by amosli on 14-6-10. */ public class MyDBHelper extends SQLiteOpenHelper{ /** * 建立數據庫的構造方法 * @param context 應用程序上下文 * name 數據庫的名字 * factory 查詢數據庫的遊標工廠通常狀況下用sdk默認的 * version 數據庫的版本通常大於0 */ public MyDBHelper(Context context) { super(context, "test.db", null, 4); } private String tag = "MyDBHelper.class"; /** * 在數據庫第一次建立時會執行 * @param db */ @Override public void onCreate(SQLiteDatabase db) { Log.d(tag, "onCreate....."); //建立一個數據庫 db.execSQL("create table person (personid integer primary key autoincrement ,name varchar(30) )"); } /** * 更新數據的時候調用的方法 * @param db * @param oldVersion * @param newVersion */ @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { Log.d(tag,"onUpgrade*******"); //增長一列 db.execSQL("alter table person add phone varchar(13) null"); } }
PersonDao.java(增刪查改都在這了)git
package com.amos.android_database.dao; import android.content.Context; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; import android.util.Log; import com.amos.android_database.MyDBHelper; import com.amos.android_database.domain.Person; import java.util.ArrayList; import java.util.List; /** * Created by amosli on 14-6-11. */ public class PersonDao { private MyDBHelper myDBHelper; public String tag = "PersonDao.class"; //在new出來的時候就實現myDBHelper初始化 public PersonDao(Context context) { myDBHelper = new MyDBHelper(context); } //增長 public void addPerson(String name, String phone) { SQLiteDatabase database = myDBHelper.getWritableDatabase(); //先判斷數據庫是否可用 if (database.isOpen()) { //執行插入操做 //database.execSQL("insert into person (name,phone) values('"+name+"','"+phone+"')"); //推薦以下寫法 database.execSQL("insert into person (name,phone) values(?,?)", new Object[]{name, phone}); database.close(); } } //查找 public boolean findPerson(String phone) { boolean result = false; SQLiteDatabase database = myDBHelper.getReadableDatabase(); if (database.isOpen()) { //database.execSQL("select * from phone='"+phone+"'"); Cursor cursor = database.rawQuery("select * from person where phone=?", new String[]{phone}); if (cursor.moveToFirst()) {//遊標是否移動到下一行,若是是,那說明有數據返回 Log.d(tag, "count:" + cursor.getColumnCount()); int nameIndex = cursor.getColumnIndex("name"); Log.d(tag, "name:" + cursor.getString(nameIndex)); cursor.close(); result = true; } else { result = false; } database.close(); } return result; } //刪除一條數據 public void deletePerson(String phone) { SQLiteDatabase database = myDBHelper.getWritableDatabase(); if (database.isOpen()) { database.execSQL("delete from person where phone=?", new Object[]{phone}); } database.close(); } //更新一條數據 public void updatePerson(String phone, String newName, String newPhone) { SQLiteDatabase database = myDBHelper.getWritableDatabase(); if (database.isOpen()) { database.execSQL("update person set name=?,phone=? where phone=?", new Object[]{newName, newPhone, phone}); } database.close(); } //查找全部person public List<Person> findAllPerson(){ List<Person> personList = new ArrayList<Person>(); SQLiteDatabase database = myDBHelper.getReadableDatabase(); if(database.isOpen()){ Cursor cursor = database.rawQuery("select * from person ", null); while(cursor.moveToNext()){ int nameIndex = cursor.getColumnIndex("name"); int phoneIndex = cursor.getColumnIndex("phone"); String name = cursor.getString(nameIndex); String phone = cursor.getString(phoneIndex); Person person = new Person(name,phone); Log.d(tag,person.toString()); personList.add(person); } } database.close(); return personList; } }
注:github
1.由上面的方法能夠看到,查找數據主要調用的是rawQuery方法,而增刪改都是經過execSQL執行數據的sql
2.必定要注意,使用database前必定要判斷是否可用,使用database.isOpen();shell
3.使用完database必定要注意關閉數據庫,database.close();否則會報異常!數據庫
AndroidManifest.xml(配置測試環境,看加粗部分)app
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.amos.android_database" android:versionCode="1" android:versionName="1.0"> <instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="com.amos.android_database"/> <uses-sdk android:minSdkVersion="7"/> <application android:label="@string/app_name"> <uses-library android:name="android.test.runner"/> <activity android:name="MyActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity> </application> </manifest>
測試類PersonDaoTest.javadom
package com.amos.android_database.test; import android.test.AndroidTestCase; import android.util.Log; import com.amos.android_database.dao.PersonDao; import com.amos.android_database.domain.Person; /** * Created by amosli on 14-6-11. */ public class PersonDaoTest extends AndroidTestCase{ private String tag = "PersonDaoTest.class"; public void testAdd() throws Exception{ PersonDao personDao = new PersonDao(getContext()); for(int i=0;i<100;i++){ personDao.addPerson("amsoli"+i,"131888870"+i); } Log.d(tag,"添加一些新用戶"); } public void testFind(){ PersonDao personDao = new PersonDao(getContext()); boolean result = personDao.findPerson("13188887776"); assertEquals(true,result); } public void testDelete(){ PersonDao personDao = new PersonDao(getContext()); personDao.deletePerson("13188887778"); } public void testUpdate(){ PersonDao personDao = new PersonDao(getContext()); personDao.updatePerson("13188887776","hi_amos","13188887775"); } public void testFindAllPerson(){ PersonDao personDao = new PersonDao(getContext()); for (Person person : personDao.findAllPerson()) { System.out.println(person.toString()); } } }
因爲要反覆測試,因此若是將數據庫反覆導出會很是麻煩,下面能夠使用命令進行查看數據庫中的數據:
1)進行命令行模式,注意是在platform-tools目錄下,而非tools目錄
sdk/platform-tools$ ./adb shell
2)使用cd命令切換到test.db的目錄
#cd /data/data/com.amos.android_database/databases/ # ls test.db
3)使用sqlite3打開test.db
# sqlite3 test.db SQLite version 3.5.9 Enter ".help" for instructions
sqlite> .database seq name file --- --------------- ---------------------------------------------------------- 0 main /data/data/com.amos.android_database/databases/test.db sqlite> .table android_metadata person
查看其中的數據:
sqlite> select * from person; 1|amsoli0|1318888700 2|amsoli1|1318888701 3|amsoli2|1318888702 4|amsoli3|1318888703 5|amsoli4|1318888704 6|amsoli5|1318888705 7|amsoli6|1318888706 8|amsoli7|1318888707 9|amsoli8|1318888708 .........
注:
i:關於Sqlite的教程能夠參考:http://www.w3cschool.cc/sqlite/sqlite-tutorial.html
ii:關於本方源代碼能夠查看:https://github.com/amosli/android_basic/tree/database