数据库的创建
1.写一个类继承SQLiteOpenHelper(构造,onCreate,onUpgrade)
/**
*数据库的帮助类
*要创建数据库操作的对象,必须借助帮助类对象
*/
public class MyHelper extends SQLiteOpenHelper {
public MyHelper(Context context, String name, CursorFactory factory,
int version) {
super(context,// 数据库帮助类要依赖的上下文对象
name,// 数据库文件的名字(不是表名)数据库的名字,后缀名可加可不加
factory,// 游标工厂,用来创建数据,一般为空
version);// 数据库的版本号,从1开始
}
@Override
/**
*在第一次 创建数据库的调用,在此方法中一般用于创建表和初始化表中的数据
*db:数据库的操作对象
*/
public void onCreate(SQLiteDatabase db) {
String sqlcreate="create table student (_id integer primary key autoincrement," +
" name varchar(20)," +
"age integer) ";
db.execSQL(sqlcreate);
}
@Override
/**
* 数据库版本升级的时候调用
* db:数据库操作的对象
* oldVersion:数据库的旧版本号
* newVersion: 数据库的新版本号
*/
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if (newVersion>oldVersion) {
// 删除旧表,创建新表
db.execSQL("drop table if exists student ");
onCreate(db);
}
}
}
2.获取到一个数据库的操作对象
// 版本号不能降低,只能增加,可以跳跃增加
helper=new MyHelper(this, DB_NAME, null, 2);
// 获取到一个可读可写的数据库对象,得到数据对象的时候就会去调用Helper中的部分方法,若磁盘空间满,会产生异常
db=helper.getWritableDatabase();
// 获取到的也是一个可读可写的数据库对象,但在特殊情况下eg:磁盘空间满了,该数据库对象变成只读的了
db=helper.getReadableDatabase();
数据库的第一种增删改查(使用SQL语句)
public class MainActivity extends Activity {
private SQLiteDatabase db;
private MyHelper helper;
private static final String DB_NAME="first.db";//数据库的名字,后缀名可加可不加
private TextView textView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView=(TextView) findViewById(R.id.textview);
// 版本号不能降低,只能增加,可以跳跃增加
helper=new MyHelper(this, DB_NAME, null, 2);
// 获取到一个可读可写的数据库对象
db=helper.getWritableDatabase();
// 获取到的也是一个可读可写的数据库对象,但在特殊情况下eg:磁盘空间满了,该数据库对象变成只读的了
db=helper.getReadableDatabase();
// insertData();
// deleteData();
// updateData();
selectData();
}
/**
* 插入数据
*/
public void insertData(){
String sql="insert into student( name,age) values ('name1',18)";
db.execSQL(sql);
// 推荐使用
db.execSQL("insert into student( name,age) values (?,?)", new Object[]{"name2",19});
}
/**
* 删除数据
*/
public void deleteData(){// 下面的三条语句等效
db.execSQL("delete from student where _id = 2");
// db.execSQL("delete from student where _id = ? ", new Object[]{2});
// db.execSQL("delete from student where _id = 2", null);
}
// 修改数据
public void updateData(){
db.execSQL("update student set name='qqq',age=25 where _id=3 ");
db.execSQL("update student set name= ? ,age= ? where _id= ? ",new Object[]{"www",29,4});
}
// 查询数据
public void selectData(){
Cursor cursor = db.rawQuery("select name,age from student ",null);
// Cursor cursor = db.rawQuery("select name,age from student where age= ?",new String[]{"25"});
//cursor.moveToNext(): 让游标依次向下一行移动,如果下一行有数据返回true,没有数据返回false
while(cursor.moveToNext()){
/*查询方式一:
* //根据查询出一行里面name所在的列号(从0开始一次增加),列号与查询的字段相对应
String name = cursor.getString(0);
int age=cursor.getInt(1);
textView.append(name+"="+age);*/
//查询方式二:
//根据列名获取到列号,后续的就不用改变,推荐使用
int nameIndex = cursor.getColumnIndex("name");
int ageIndex = cursor.getColumnIndex("age");
String name = cursor.getString(nameIndex);
int age=cursor.getInt(ageIndex);
}
}
数据库的第二种增删改查(使用Android的方法)
建表语句
db.execSQL("create table food (_id integer primary key autoincrement," +
"name varchar ," +
"price varchar(10))");
插入数据
private void insertApi(){
/*
* 参数解释insert(table, nullColumnHack, values)==>()
* table:表名
* nullColumnHack:没有插入字段的默认值
* values:要添加的数据,ContentValues的对象,通过put放数据,键为字段名,值为插入值
* 返回值:插入数据的行号id,返回-1表插入数据失败
* */
for (int i = 0; i < 20; i++) {
ContentValues values=new ContentValues();
values.put("name", "apple"+i);
values.put("price", "5.5"+i);
long rowId = db.insert(TABLE_NAME, null, values);
if (rowId==-1) {
Log.e("info", "插入数据失败==="+i);
}
}
}
删除数据
private void delectApi() {
/*
* db.delete(table, whereClause, whereArgs)
* table: 表名
* whereClause: sql语句中的where后面的赛选条件(不写关键字where)
* whereArgs: 如果赛选条件有?,这就是赛选条件的具体值
* 返回值:删除的行数,若等于0,表示删除失败
* 注:如果没有where赛选条件whereClause和whereArgs为 null
* */
//db.execSQL("delete from table food where name =? ",new String[]{"apple1"});等价
int rows = db.delete(TABLE_NAME, "name = ? ", new String[]{"apple1"});
if (rows>0) {
Toast.makeText(this, "删除成功,共删除"+rows+"条数据!", 1).show();
}else {
Toast.makeText(this, "删除失败", 1).show();
}
}
修改数据
private void updataApi(){
/*如果没有赛选条件,最后两个可以填 null
* db.update(table, values, whereClause, whereArgs);
* table:表名
* values: 要修改的数据,ContentValues的对象,通过put放数据,键为字段名,值为插入值
* whereClause: sql语句中的where后面的赛选条件(不写关键字where)
* whereArgs: 如果赛选条件有?,这就是赛选条件的具体值,为String 的数组
* 返回值: 修改数据受影响的行数,
* */
// db.execSQL("update food set price =100.0 where _id =15 ");
ContentValues values=new ContentValues();
values.put("price", "100.0");
int rows = db.update(TABLE_NAME, values, " _id = ? ", new String[]{"15"});
if (rows>0) {
Toast.makeText(this, "修改成功,共修改"+rows+"条数据!", 1).show();
}else {
Toast.makeText(this, "没有修改到数据", 1).show();
}
}
查询数据
private void selectApi() {
/*sql="select name,price from food where name = apple1 "
* db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy)
* table: 表名
* columns: 要查询的字段,String的数组
* selection: 赛选条件的where语句(不写关键字where了)
* selectionArgs: 如果赛选条件有,这里为赛选条件的值
* 以下三个参数没有就填null
* groupBy: 分组
* having: 分组的条件
* orderBy: 排序方式
* */
/*sql=" select name,price,_id from limit "0,10" "
db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy,
limit);分页查询使用,eg: "1,10" 1:代表开始查询的位置,10:查询的数量,结果就是从1位置开始查询,查询出10条数据
* */
cursor=db.query(TABLE_NAME,
new String[]{"name","price","_id"},null, null, null, null, null, "0,20");
Cursor cursor = db.query(TABLE_NAME,new String[]{"name","price","_id"},
"name=?", new String[]{"apple2"}, null, null, null);
// 相当于 select * from food
cursor = db.query(TABLE_NAME,new String[]{"name","price","_id"},
null, null, null, null, null);
while(cursor.moveToNext()){
String name = cursor.getString(cursor.getColumnIndex("name"));
String price = cursor.getString(cursor.getColumnIndex("price"));
int id = cursor.getInt(cursor.getColumnIndex("_id"));
textView.append(name+",="+price+",="+id+"=======\n");
}
}
分页查询
/*sql=" select name,price,_id from limit "0,10" "
db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy,
limit);分页查询使用,eg: "1,10" 1:代表开始查询的位置,10:查询的数量,结果就是从1位置开始查询,查询出10条数据
* */
cursor=db.query(TABLE_NAME,
new String[]{"name","price","_id"},null, null, null, null, null, "0,20");
数据库适配器SimpleCursorAdapter
/*数据的适配器,不用创建java bean对象,不用自定义适配器
* new SimpleCursorAdapter(context, 上下文
* layout: 每个item要展示的布局文件
* c: 数据源,查询数据库的时候得到的cursor游标
* from: 数据获取的来源,表的字段数组
* to: 数据的去处,item布局的控件id的数组
* flags: 标记,
标记有CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER : 2 和 CursorAdapter.FLAG_AUTO_REQUERY : 1
* 交换数据源,可以换新的数据源:simpleCursorAdapter.swapCursor(cursor);
* )*/
simpleCursorAdapter=new SimpleCursorAdapter(this,
R.layout.item,
null, new String[]{"_id","name","price"},
new int[]{R.id.item_id,R.id.item_name,R.id.item_price},
CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
listView.setAdapter(simpleCursorAdapter);
// 交换数据源,可以换新的数据源
//simpleCursorAdapter.swapCursor(cursor);
simpleCursorAdapter.changeCursor(cursor);//也是交换数据源,会自动关闭老的cursor,推荐使用
Cursor类
getColumnCount():获取到查询后表中的字段列数
getCount():行数
getColumnIndex(String columnName):获取到指定字段名的下标位置
getColumnName(int columnIndex):根据列号得到列名
getType(int columnIndex) :得到指定列数的类型
FIELD_TYPE_NULL :null
FIELD_TYPE_INTEGER :integer
FIELD_TYPE_FLOAT :float
FIELD_TYPE_STRING :string
FIELD_TYPE_BLOB :blob
getLong(int columnIndex) :得到指定列号的long数据
getString(int columnIndex) :得到指定列号的string数据
isNull(int columnIndex) :判断指定列号是否为null
boolean moveToNext() :移动游标到下一行,若下行有数据返回true
数据库事务
4 数据库的事务
事务: 执行多条sql语句,要么同时执行成功,要么同时执行失败,不能有的成功,有的失败
银行转账
//点击按钮执行该方法
public void transtation(View v){
//1.创建一个帮助类的对象
BankOpenHelper bankOpenHelper = new BankOpenHelper(this);
//2.调用数据库帮助类对象的getReadableDatabase创建数据库,初始化表数据,获取一个SqliteDatabase对象去做转账(sql语句)
SQLiteDatabase db = bankOpenHelper.getReadableDatabase();
//3.转账,将李四的钱减200,张三加200
db.beginTransaction();//开启一个数据库事务
try {
db.execSQL("update account set money= money-200 where name=?",new String[]{"李四"});
int i = 100/0;//模拟一个异常
db.execSQL("update account set money= money+200 where name=?",new String[]{"张三"});
db.setTransactionSuccessful();//标记事务中的sql语句全部成功执行
} finally {
db.endTransaction();//判断事务的标记是否成功,如果不成功,回滚错误之前执行的sql语句
}
}
Android数据库入门
最新推荐文章于 2021-05-28 14:12:07 发布