创建数据库

1.创建一个类继承于SQLiteOpenHelper

实现里面的方法,创建构造方法
参数解释:

  • @param context to use for locating paths to the the database 上下文
  • @param name of the database file, or null for an in-memory database 数据库名称
  • @param factory to use for creating cursor objects, or null for the default 游标工厂
  • @param version number of the database (starting at 1); if the database is older 版本号

2.创建对象新建数据库

调用getReadableDatabase()/getWriteableDatabase()方法即可创建数据库

1
2
3
//创建数据库
db_DatabaseHelper helper = new db_DatabaseHelper(this);
helper.getWritableDatabase();

onCreate(SQLiteDatabase db)

第一次创建数据库的时候调用该函数

1
2
3
4
5
//创建数据表(表名单独用类保存为常量)
//1.编写sql语句
String sql = "create table" + TABLE_NAME + "_id integer, name varhcar(50), age integer, salary integer";
//2.执行sql语句
db.execSQL(sql);

onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)

当数据库升级的时候调用该函数
根据版本号不同对数据库做相应的处理(增减字段等)

编写DAO操作类

1.通过helper对象获取SQLiteDatabase对象
2.编写sql语句
3.SQLiteDatabase对象执行sql语句
4.关闭数据库

eg:

1
2
3
4
QLiteDatabase db = mhelper.getWritableDatabase();
String sql = "insert into " + db_Constants.TABLE_NAME + "(_id,name,age,salary,phone,address)values(?,?,?,?,?,?)";
db.execSQL(sql, new Object[]{1,"张三",21,3500,"13678088714","陕西西安"});
db.close();

5.查询操作

  • 查询操作调用方法rawQuery(sql,null);
  • 该方法返回游标对象 Cursor
  • moveToNext()遍历返回结果
  • getColumnIndex(“columnName”); 通过列名获取列号
  • getString(index)\getInt(index); 通过列号获取数据
  • 关闭游标、数据库。

eg:

1
2
3
4
5
6
7
8
9
10
SQLiteDatabase db = mhelper.getWritableDatabase();
String sql = "select * from " + db_Constants.TABLE_NAME;
Cursor cursor = db.rawQuery(sql,null);
while(cursor.moveToNext()){
int index = cursor.getColumnIndex("name");
String name = cursor.getString(index);
Log.d(TAG, name);
}
cursor.close();
db.close();

使用Android API操作数据

Android提供了数据操作的API,使操作数据库变得更加简单

插入

  • insert(数据表名称, null, ContentValues);
  • ContentValues是map容器,通过put()添加键值对及列名与其对应的值
  • @return (long)新插入的行号,若为-1表示发生错误

eg:

1
2
3
4
5
6
7
8
9
10
11
SQLiteDatabase db = mhelper.getWritableDatabase();
//String sql = "insert into " + db_Constants.TABLE_NAME + "(_id,name,age,salary,phone,address)values(?,?,?,?,?,?)";
//db.execSQL(sql, new Object[]{1,"张*",2*,****,"136****8714","陕西**"});
ContentValues values = new ContentValues();
values.put("_id", 1);
values.put("name", "张*");
values.put("salary", ****);
values.put("phone", "1367****714");
values.put("address", "陕西**");
db.insert(db_Constants.TABLE_NAME, null, values);
db.close();

删除

  • delete(数据表名称, 条件, 参数)
  • 参数是用字符串数组表示,代替条件中的‘?’
  • @return (int)影响行数

eg:

1
2
3
4
5
6
7
SQLiteDatabase db = mhelper.getWritableDatabase();
//String sql = "delete from " + db_Constants.TABLE_NAME + " where age = 30";
//db.execSQL(sql);
String[] Args = new String[1];
Args[0] = "30";
db.delete(db_Constants.TABLE_NAME,"age = ?",Args);
db.close();

更新

  • update(数据表名称, ContentValues, 条件, 参数)
  • return (int)影响行数

eg:

1
2
3
4
5
6
7
8
9
SQLiteDatabase db = mhelper.getWritableDatabase();
//String sql = "update " + db_Constants.TABLE_NAME + " set salary = 6500 where age =21";
//db.execSQL(sql);
ContentValues values = new ContentValues();
values.put("salary", 6500);
String[] Args = new String[1];
Args[0] = "30";
db.update(db_Constants.TABLE_NAME, values, "age = ?", Args);
db.close();

查询

  • query(数据表名称, 返回字段, 条件, 参数, 分组, HAVING,排序)
  • HAVING 是条件中有函数的时候使用
  • @return (Cursor)游标
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SQLiteDatabase db = mhelper.getWritableDatabase();
// String sql = "select * from " + db_Constants.TABLE_NAME;
// Cursor cursor = db.rawQuery(sql,null);
// while(cursor.moveToNext()){
// int index = cursor.getColumnIndex("name");
// String name = cursor.getString(index);
// Log.d(TAG, name);
// }
// cursor.close();
Cursor cursor = db.query(db_Constants.TABLE_NAME, null, null, null,null,null,null);
while(cursor.moveToNext()){
int index = cursor.getColumnIndex("name");
String name = cursor.getString(index);
Log.d(TAG, name);
}
db.close();

数据库事务

安全性

  • 当数据库在进行写操作时,由于异常发生,可能导致数据前后出现不一致的对象,因此有必要采用事务
1
2
3
4
5
6
7
8
9
db.beginTransaction();//开启事务
try{//数据操作
db.setTransactionSuccessful();
}catch(exception e){
//处理异常
}finally{
db.endTransaction();//关闭事务
db.close();
}

高效性

  • 在执行大量数据操作时,普通方式会重复打开关闭数据库,而开启事务后,是将数据先写入内存,再一次性写入数据。

代码