数据库的增,删,改,查,事务操作---------
直接上项目:
--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 :
@H_403_79@//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下
原文链接:https://www.f2er.com/sqlite/199955.html