sqlite 的简介
对于sqlite 就是一种轻型的嵌入式的数据库,多用于手机,车机等,至于他的原理百度有很多大佬对他的详细介绍,我就不在这里累述了。 今天主要是想记录一下sqlite的详细使用,我主要是通过一个实例理解sqlite 的增删改查。 如图,这是一个简单的用户登录注册,主要就记录一下两种用户的登录注册
sqlite 的使用就是继承SQliteOpenHelper这个数据库助力类,一般写的数据库都不会对外直接进行数据的操作,这是对数据安全的保护。一般可以把他看作一个工具类,私有化构造函数,增加一个对外访问的接口。
public class Stu_Tea_Sqlite extends SQLiteOpenHelper{
private static final String STU_TEA_COURSE ="stc.db";
private static final String TEACHER ="teacher";
private static final String STUDENT ="student";
private static final String COURSE="course";
private static final String STU_COURSE ="stu_course";
private static final String TEA_COURSE_WORK ="tea_work";
private static final String STU_COURSE_WORK ="stu_work";
private static SQLiteOpenHelper instance;
public static synchronized SQLiteOpenHelper getInstance(Context context){
if(instance ==null){
instance =new Stu_Tea_Sqlite(context,STU_TEA_COURSE,null,2);
}
return instance;
}
private Stu_Tea_Sqlite(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
sqLiteDatabase.execSQL("create table if not exists "+ TEACHER +"(_id Integer primary key autoincrement," +"_Tid unique varchar(7) not null,"+"T_name varchar(20) not null," +
"T_pass varchar(20) not null," + "T_email varchar(30) not null," + "T_tel varchar(15) not null,"+ "T_sex varchar(2) not null," +
"T_profession varchar(30) )");
sqLiteDatabase.execSQL("create table if not exists "+ STUDENT +"(_id Integer primary key autoincrement,"+"_Sid unique varchar(7) not null ," +"S_name varchar(20) not null," +
"S_pass varchar(20) not null," + "S_email varchar(30) not null," + "S_tel varchar(15) not null,"+ "S_sex varchar(2) not null," +
"S_profession varchar(30) )");
sqlite尤其注意外键的使用,外键一定要加unique约束,不然会报错插入外键不匹配,最好还加上sqlite> PRAGMA foreign_keys = ON;打开外键的语句
然后在你的oncreate函数里创建表,创建表的调用的是sqLiteDatabase.execSQL()函数,执行的创建表的SQL语法和我们平时的语法一样。 值得主要的是,sqlite数据表的创建,他的主键必须是一个INteger类型的,而且他的规范写法是下划线开头,后面列没有严格要求,数据类型可以使用具体的也可以使用TEXT代替,因为后面都会转化为TEXT形式存储
public interface Manager_Date {
public void createDB(Context context);
public void StudentInsert(Student student, Context context);
public Student StudentQuery(String ID,Context context);
public void StudentUpdate(Student student,Context context);
public void TeacherAdd(Teacher teacher,Context context);
public Teacher TeacherQuery(String ID,Context context);
public void TeacherUpdate(Teacher teacher,Context context);
}
这里我写了一个接口主要是方便我后面功能实现数据的调用,后面数据的增删改查就直接调用接口 调用public void createDB(Context context)就可以创建一个数据库,一般只有在第一次创建的时候调用 我写了一个数据库管理类,实现数据库操作的接口
public class Manager_SQL implements Manager_Date{
@Override
public void createDB(Context context){
SQLiteOpenHelper openHelper=Stu_Tea_Sqlite.getInstance(context);
SQLiteDatabase database=openHelper.getWritableDatabase();
}
调用方法后,就会创建一个数据库如图: 一般数据库的查看可以在Android studio的 旁边的Device File Explorer 下的data/data/app(你的项目名字)/databases 下有你刚才创建的数据库文件.db (如何你没有发现你的Android 里没有Device File Explorer ,你可以百度,如何打开视图。) 一般如果你要看数据库具体的数据,可以把他拉出来下载一个专门的sqlite 数据库查看软件查看,如果你和我一样懒得下载安装也可以在Android studio下的Database inspactor里查看,如上图。但是这个一般要启动模拟器打开你的测序才能查看。
好了数据库表创建好了,然后就可以对数据库表进行增删改查操作了。
@Override
public void StudentInsert(Student student,Context context) {
SQLiteOpenHelper openHelper=Stu_Tea_Sqlite.getInstance(context);
SQLiteDatabase database=openHelper.getWritableDatabase();
if(database.isOpen()){
ContentValues values=new ContentValues();
values.put("_Sid",student.getId());
values.put("S_name",student.getName());
values.put("S_pass",student.getPassword());
values.put("S_email",student.getEmail());
values.put("S_sex",student.getSex());
values.put("S_tel",student.getTelephone());
values.put("S_profession",student.getProfession());
Log.d("插入:",student.getEmail());
Log.d("插入:",student.getPassword());
Log.d("插入:",student.getSex());
Log.d("插入:",student.getProfession());
Long count=database.insert("student",null,values);
if(count!=-1){
Log.d("stu","插入数据库成功"+count);
}
else {
Log.d("stu","插入数据库失败"+count);
}
}
database.close();
}
@Override
public Student StudentQuery(String ID,Context context){
SQLiteOpenHelper openHelper=Stu_Tea_Sqlite.getInstance(context);
SQLiteDatabase database=openHelper.getReadableDatabase();
Student student=new Student();
if(database.isOpen()){
Cursor cursor=database.query("student",null,"_Sid like ?",new String[]{ID},null,null,null);
if(cursor.getCount()>0){
while (cursor.moveToNext()){
String id=cursor.getString(cursor.getColumnIndex("_Sid"));
String emailString=cursor.getString(cursor.getColumnIndex("S_email"));
String nameString = cursor.getString(cursor.getColumnIndex("S_name"));
String password = cursor.getString(cursor.getColumnIndex("S_pass"));
String sex=cursor.getString(cursor.getColumnIndex("S_sex"));
String profession=cursor.getString(cursor.getColumnIndex("S_profession"));
String tel=cursor.getString(cursor.getColumnIndex("S_tel"));
student.setId(id);
student.setEmail(emailString);
student.setName(nameString);
student.setPassword(password);
student.setTelephone(tel);
student.setSex(sex);
student.setProfession(profession);
}
}
else {
Log.d("cursor","数据不存在");
}
cursor.close();
}
database.close();
return student;
}
@Override
public void StudentUpdate(Student student,Context context){
SQLiteOpenHelper openHelper=Stu_Tea_Sqlite.getInstance(context);
SQLiteDatabase database=openHelper.getWritableDatabase();
if(database.isOpen()){
ContentValues values=new ContentValues();
values.put("S_name", student.getName());
values.put("S_email", student.getEmail());
values.put("S_sex", student.getSex());
values.put("S_tel", student.getTelephone());
values.put("profession", student.getProfession());
database.update("student",values,"_Sid=?",new String[]{student.getId()});
}
database.close();
}
对于数据的删除就是一样的操作,调用database.delete(),对指定的数据删除,值得注意的是数据库的查询操作,数据绑定在游标Cursor上,然后移动游标查询数据后,记得关闭游标和数据库,否则会消耗性能。
第一次写文章记录总结的知识点,有不足的地方,或者有什么更好的写法、优化的欢迎指正。
|