数据库的增,删,改,查,事务操作---------
直接上项目:
--com.itheima.db
MainActivity------------这个类在里没什么用的
public class MainActivity extends Activity{ @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } }
--com.itheima.db
PersonSQLiteOPenHelper :
//public class PersonSQLiteOPenHelper extends SQLiteOpenHelper {
// public PersonSQLiteOPenHelper(Context context,String name, // CursorFactory factory,int version) { // super(context,数据库创建在那个文件下 // name,数据库的名字 // factory,游标结果集 ---一般为null // version);数据库的版本---不能小于1 // }
public class PersonSQLiteOPenHelper extends SQLiteOpenHelper { private static final String TAG = "PersonSQLiteOPenHelper";
/** * 数据库的构造方法 * --用来定义数据库的名称 * --数据库查询的结果集 * --数据库的版本号----- * @param context * @param name * @param factory * @param version */ public PersonSQLiteOPenHelper(Context context) { //创建一个名字为person.db的数据库,版本为1 super(context,"person.db",null,1); // version 1版本号每次修改表结构是要改变数字2->3->4... 比如:插入一个字段或删除一个字段 } /** * 数据库第一次被创建时调用的方法 * @param db 被创建的数据库 * */ @Override public void onCreate(SQLiteDatabase db) { //初始化数据库的表结构 //db.execSQL("create table person (id integer primary//主键 key autoincrement//自增长, // name varchar(20), // number varchar(20))"); db.execSQL("create table person(id integer primary key autoincrement,name varchar(20),number varchar(20))"); } /** * 当数据库的版本号发生了变化的时候(增加的时候)调用 */ @Override //public void onUpgrade(SQLiteDatabase db,int oldVersion//旧数据库的版本,int newVersion//新数据库的版本) public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion) { Log.i(TAG,"数据库的版本变化了...."); //修改 ------ 改 表结构 人类(表) 加一个账户的字段------>上面的版本号version要改变(每次修改时) db.execSQL("alter table person add account varchar(20)"); } }
--com.itheima.db.dao
PersonDao:
///操作数据库的类---Dao public class PersonDao { //拿到数据库的实例 private PersonSQLiteOPenHelper helper; //在构造方法里面 完成helper的初始化 public PersonDao(Context context){ helper = new PersonSQLiteOPenHelper(context); }
/** * 添加一条记录到数据库 * @param name 姓名 * @param number 电话 */ public void add(String name,String number){ //拿到数据库,让数据库具有可写的操作 SQLiteDatabase db = helper.getWritableDatabase(); //这样写容易出错---不推荐 //db.execSQL("insert into person (name,number) values ('zhangsan','110')"); //推荐---用占位符的方式写 //db.execSQL(sql //要执行的语句,bindArgs //数组) db.execSQL("insert into person (name,number) values ( ?,?)",new Object[]{name,number}); db.close(); } /** * 查询记录是否存在 * @param name 姓名 * @param true 存在 false 不存在 */ public boolean find(String name){ //因为是查询,所以拿到数据库,然后让数据库具有可读的操作 SQLiteDatabase db= helper.getReadableDatabase(); //db.rawQuery(sql,selectionArgs//字符串数组) // 返回一个游标(用游标接收) Cursor cursor=db.rawQuery("select * from person where name= ?",new String[]{name}); // 指向下一个的时候才显示真实值(结果) boolean result= cursor.moveToNext(); //指向下一个才显示真实值(结果)---用布尔值接收(有没有返回) //关闭游标 cursor.close(); //关闭数据库 db.close(); return result; } /** * 修改一条记录 * @param name 要修改的人的姓名 * @param newnumber 新的号码 */ public void update(String name,String newnumber){ //拿到数据库,让数据库具有可写的操作 SQLiteDatabase db = helper.getWritableDatabase(); db.execSQL("update person set number=? where name=?",new Object[]{newnumber,name}); db.close(); } /** * 删除一条记录 * @param name */ public void delete(String name){ SQLiteDatabase db= helper.getWritableDatabase(); db.execSQL(" delete from person where name=?",new Object[]{name}); db.close(); } /** * 返回全部的数据库的信息 * @return */ public List<Person> findAll(){ SQLiteDatabase db=helper.getReadableDatabase(); List<Person> persons= new ArrayList<Person>(); Cursor cursor=db.rawQuery("select name,id,number from person",null); while (cursor.moveToNext()) { //如果指定查询的字段,就不灵活----所以不推荐 // int id= cursor.getInt(0); //第一列 // String name=cursor.getString(1);//第二列 // String number=cursor.getString(2);//第三列 //---------------------------------------------------- //推荐这种----直接标示要取的列(的字段) int id=cursor.getInt(cursor.getColumnIndex("id")); String name=cursor.getString(cursor.getColumnIndex("name")); String number=cursor.getString(cursor.getColumnIndex("number")); Person p= new Person(id,name,number); persons.add(p); } //---end 全部查询 cursor.close(); db.close(); return persons; } }
--com.itheima.db.dao
PersonDao2
///操作数据库的类---Dao //--------用系统API操作数据库 public class PersonDao2 { //拿到数据库的实例 private PersonSQLiteOPenHelper helper; //在构造方法里面 完成helper的初始化 public PersonDao2(Context context){ helper = new PersonSQLiteOPenHelper(context); } /** * 添加一条记录到数据库 * @param name 姓名 * @param number 电话 * @return */ public long add(String name,String number,int money){ //拿到数据库,让数据库具有可写的操作 SQLiteDatabase db = helper.getWritableDatabase(); //db.execSQL("insert into person (name,number}); //有自增长的时候不用管它了,可以为null //db.insert(table //表名,nullColumnHack//允许为空值,values) ContentValues values= new ContentValues(); //values.put(key,value) values.put("name",name); values.put("number",number); values.put("money",money); long id=db.insert("person",values); db.close(); return id; //如果返回-1,表示失败了 } /** * 查询记录是否存在 * @param name 姓名 * @param true 存在 false 不存在 */ public boolean find(String name){ //因为是查询,然后让数据库具有可读的操作 SQLiteDatabase db= helper.getReadableDatabase(); //Cursor cursor=db.rawQuery("select * from person where name= ?",new String[]{name}); //db.query(table//查询的表名, // columns//查询的列,填null表示全部的列, // selection//查询的条件的占位符, // selectionArgs,//查询的条件对应的数组 // groupBy,//分组查询,这里没用到 ---null // having,// 这里没用到 ---null // orderBy)//排序,这里没用到 ---null Cursor cursor =db.query("person","name=?",new String[]{name},null); boolean result= cursor.moveToNext(); //指向下一个才显示真实值(结果)---用布尔值接收(有没有返回) cursor.close(); db.close(); return result; } /** * 修改一条记录 * @param name 要修改的人的姓名 * @param newnumber 新的号码 * @return */ public int update(String name,让数据库具有可写的操作 SQLiteDatabase db = helper.getWritableDatabase(); //db.execSQL("update person set number=? where name=?",name}); //ContentValues: 是一个Map的集合 ContentValues values=new ContentValues(); values.put("number",newnumber); //db.update(table,values,whereClause//要修改的条件,whereArgs//对应参数) //返回行数 int number=db.update("person",new String[]{newnumber}); db.close(); return number; } /** * 删除一条记录 * @param name * @return */ public int delete(String name){ SQLiteDatabase db= helper.getWritableDatabase(); //db.execSQL(" delete from person where name=?",new Object[]{name}); //db.delete(table,whereClause,whereArgs) int number=db.delete("person",new String[]{name}); db.close(); return number; } /** * 返回全部的数据库的信息 * @return */ public List<Person> findAll(){ SQLiteDatabase db=helper.getReadableDatabase(); List<Person> persons= new ArrayList<Person>(); //Cursor cursor=db.rawQuery("select name,null); //db.query(table,columns//所要查询的内容,selection,selectionArgs,groupBy//--null,having//--null,orderBy//--null); Cursor cursor=db.query("person",new String[]{"name","id","number"},null); while (cursor.moveToNext()) { //如果指定查询的字段,number); persons.add(p); } //---end 全部查询 cursor.close(); db.close(); return persons; } }
--com.itheima.db.domain
Person:
///人类 public class Person { private int id; private String name; private String number; public Person() { } // 创建实例的时候调用 public Person(int id,String number) { this.id = id; this.name = name; this.number = number; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getNumber() { return number; } public void setNumber(String number) { this.number = number; } @Override public String toString() { return "Person [id=" + id + ",name=" + name + ",number=" + number + "]"; } }
--com.itheima.db.test
TestPersonDB
//--------------测试类--------------------------------
//-----------测试PersonDao2 时,直接把PersonDao该为PersonDao2 public class TestPersonDB extends AndroidTestCase { public void testCreateDB() throws Exception{ PersonSQLiteOPenHelper helper= new PersonSQLiteOPenHelper(getContext()); //让数据库可写操作 //helper.getWritableDatabase(); //拿到数据库 SQLiteDatabase db = helper.getWritableDatabase(); } ///添加 public void testAdd() throws Exception{ PersonDao2 dao= new PersonDao2(getContext()); dao.add("wangwu","123",5000); dao.add("zhangsan","321",5000); } ///查找-------如果还没添加 (wangwu)会报错!!!! public void testFind() throws Exception{ PersonDao2 dao= new PersonDao2(getContext()); boolean result=dao.find("wangwu"); //断言 //assertEquals(expected //预期的,actual//真实的); assertEquals(true,result); } public void testUpdate() throws Exception{ PersonDao2 dao= new PersonDao2(getContext()); dao.update("wangwu","321"); } ///删除 public void testDelete() throws Exception{ PersonDao2 dao= new PersonDao2(getContext()); dao.delete("wangwu"); } ///查询全部 public void findAll() throws Exception{ PersonDao2 dao= new PersonDao2(getContext()); List<Person> persons=dao.findAll(); for (Person p : persons) { System.out.println(p.toString()); } } public void testTransaction() throws Exception{ PersonSQLiteOPenHelper helper= new PersonSQLiteOPenHelper(getContext()); SQLiteDatabase db= helper.getWritableDatabase(); //开始数据库的事务 db.beginTransaction(); try { db.execSQL("update person set account= account-1000 where name = ?",new Object[]{"zhangsan"}); db.execSQL("update person set account= account+1000 where name = ?",new Object[]{"wangwu"}); //标记数据库事务执行成功 db.setTransactionSuccessful(); }catch(Exception e){ e.printStackTrace(); } finally { db.endTransaction(); db.close(); } } }
AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.itheima.db" android:versionCode="1" android:versionName="1.0" > <instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="com.itheima.db" /> <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="17" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <uses-library android:name="android.test.runner" /> <activity android:name="com.itheima.db.MainActivity" 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>
运行 在TestPersonDB类里面 光标放在增,查等方法名右键 逐个测试
生成的数据库在 data/data/ com.itheima.db下
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|