SQList

   数据库的增,删,改,查,  事务操作---------

   直接上项目:

--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下



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值