数据库的增,删,改,查, 事务操作---------
直接上项目:
--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) values ( ?, ?)", new Object[]{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", null, 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", null, "name=?", new String[]{name}, null, null, null);
boolean result= cursor.moveToNext(); //指向下一个才显示真实值(结果)---用布尔值接收(有没有返回)
cursor.close();
db.close();
return result;
}
/**
* 修改一条记录
* @param name 要修改的人的姓名
* @param newnumber 新的号码
* @return
*/
public int update(String name,String newnumber){
//拿到数据库,让数据库具有可写的操作
SQLiteDatabase db = helper.getWritableDatabase();
//db.execSQL("update person set number=? where name=?", new Object[]{newnumber,name});
//ContentValues: 是一个Map的集合
ContentValues values=new ContentValues();
values.put("number", newnumber);
//db.update(table, values, whereClause//要修改的条件, whereArgs//对应参数)
//返回行数
int number=db.update("person", values,"name=?" , 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", "name=?", 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,id,number from person", null);
//db.query(table, columns//所要查询的内容, selection, selectionArgs, groupBy//--null, having//--null, orderBy//--null);
Cursor cursor=db.query("person", new String[]{"name","id","number"}, null, null, null, null, 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.domain
Person:
///人类
public class Person {
private int id;
private String name;
private String number;
public Person() {
}
// 创建实例的时候调用
public Person(int id, String name, 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下