AndroidStudio-3.2.1(十四)SQLite基本操作
本篇介绍android数据库SQLite的增删改查基本操作及使用Navicat查看数据库。
android设备上的程序一般使用SQLite作为存储数据库,android sdk应封装了对sqlite的常用操作。SQLite是一个单机版数据库,类似于access,存储文件是.db文件。
增删改查
1、先实现一个数据库操作类,继承自SQLiteOpenHelper。有3个主要方法:
- 构造函数: 这里需要数据库名和版本号,用来创建数据库
- onCreate :这里编写创建表的sql语句。我们这里创建一个user表,有ID、Age、Birthday、Online4个字段,分别是int、int、date、boolen类型。
- onUpgrade:升级处理,一般当版本号变大时,对现有库进行升级处理。
- 具体调用:
DbHelper dbHelper = new DbHelper(getApplicationContext());
dbHelper .addRecord()//自定义方法
实现代码:
public class DbHelper extends SQLiteOpenHelper {
private static final int DB_VERSION = 1;
private static final String DB_NAME = "users.db";
public static final String TABLE_Users = "tuser";
public DbHelper(Context context) {
// 传递数据库名与版本号给父类
super(context, DB_NAME, null, DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
// 创建表
String sql = "create table if not exists " + TABLE_Users +
" (Id integer primary key, UserName text, Age integer, " +
"Birthday Date,Online boolean)";
db.execSQL(sql);
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
if (newVersion > oldVersion) {
String sql = "DROP TABLE IF EXISTS " + TABLE_Users;
db.execSQL(sql);
onCreate(db);
}
}
}
2、增加记录。
在表里增加记录用到ContentValues键值对结构,把对应列名的值添加进去(有点儿ORM的意思)。注意没有Date类型,需要转为String。最后调用getWritableDatabase().insert方法。
public void addRecord(String username, int age, boolean online, Date birthday) {
ContentValues contentValues = new ContentValues();
contentValues.put("UserName", username);
contentValues.put("Age", age);
contentValues.put("Birthday", birthday.toString());
contentValues.put("Online", online);
getWritableDatabase().insert(TABLE_Users, null, contentValues);
}
如果需要事务,那就酱式儿:
db = getWritableDatabase();
db.beginTransaction();
...
db.insertOrThrow(...);
db.setTransactionSuccessful();
3、删除记录
免疫SQL注入,从使用参数做起。
public void deleteRecord(String username) {
getWritableDatabase().delete(TABLE_Users,
"UserName=?", new String[]{username});
}
4、更新记录,也使用ContentValues。
public void updateRecord(String username) {
ContentValues contentValues = new ContentValues();
contentValues.put("Age", 18);
contentValues.put("Online", true);
getWritableDatabase().update(TABLE_Users,
contentValues, "UserName=?", new String[]{username});
}
5、查询记录。
所有的数据库查询大概都会用到Cursor。
public void queryRecord(String username){
// 相当于 select * from students 语句
Cursor cursor = getReadableDatabase().query(TABLE_Users, null,
"UserName=?", new String[]{username},
null, null, null, null);
while (cursor.moveToNext()) {
int Id = cursor.getInt(0); // 直接通过索引获取字段值
int age = cursor.getInt(cursor.getColumnIndex("Age"));// 直接通过列名获取字段值
String online = cursor.getString(cursor.getColumnIndex("Online"));
String birthday = cursor.getString(cursor.getColumnIndex("Birthday"));
System.out.println("id: " + Id + " Age: " + age+ " Online: " + online+ " Birthday: " + birthday);
}
cursor.close();
}
Cursor的其它方法:
1 c.move(int offset); //以当前位置为参考,移动到指定行
2 c.moveToFirst(); //移动到第一行
3 c.moveToLast(); //移动到最后一行
4 c.moveToPosition(int position); //移动到指定行
5 c.moveToPrevious(); //移动到前一行
6 c.moveToNext(); //移动到下一行
7 c.isFirst(); //是否指向第一条
8 c.isLast(); //是否指向最后一条
9 c.isBeforeFirst(); //是否指向第一条之前
10 c.isAfterLast(); //是否指向最后一条之后
11 c.isNull(int columnIndex); //指定列是否为空(列基数为0)
12 c.isClosed(); //游标是否已关闭
13 c.getCount(); //总数据项数
14 c.getPosition(); //返回当前游标所指向的行数
15 c.getColumnIndex(String columnName);//返回某列名对应的列索引值
16 c.getString(int columnIndex); //返回当前行指定列的值
6、以上程序的配套界面:
Navicat查看数据库
Navicat是一款数据库界面端,可以管理Oracle、SQLite、Postgre、Mysql等众多非猪流数据库。
1、先把刚才的数据库文件导出到本地。打开as的DeviceFileExplorer,在/data/data/程序包名/databases下面,右键db文件,另存到本地桌面。)
2、打开Navicat,新建SQLite连接。
3打开连接,就能看到数据表user了。