android学习——数据库SQLite的基本操作

   如果想要在android中使用数据库,使用SQLite是一个非常好的选择,因为它是android内置的数据库,提供了很多支持。

数据库的使用无非就是CRUD,也就是"Create,Read,Update,Delete"这四个基本操作。

一.Create

Create就是创建表,而要想创建表,首先必须要创建或者打开数据库。

有两种方式可以做到这点:

1.手动创建或者打开数据库

SQLiteDatabase database = openOrCreateDatabase("Student.db", MODE_PRIVATE, null);

调用openOrCreateDatabase()方法,如果有该数据库,就打开,没有就创建一个。该方法的具体信息还是得看源码,但一般我们使用的时候,只要指定数据库的名字和指定该数据库是私有的就行。

2.使用SQLiteOpenHelper

public class SQLHelper extends SQLiteOpenHelper {

    public SQLHelper(Context context, String name, CursorFactory factory,
                     int version) {
        super(context, name, factory, version);
    }

    @Override
    public void onCreate(SQLiteDatabase db) {}

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {}
}

   然后我们再在Activity这样使用:

SQLHelper helper = new SQLHelper(this, "Student.db", null, 1);

版本号(不能为负数)是为了方便以后升级数据库,由于是初版,版本号就是1。
        SQLiteOpenHelper是一个抽象的数据库操作类,首先执行的是OnCreate,这里我们可以执行创建表等动作,但该方法并没有真正创建数据库,创建数据库是在以下的情况:

SQLiteDatabase database = helper.getWritableDatabase();

调用getWritableDatabase()或者getReadableDatabase()时,就会真正创建数据库。

创建或打开数据库后,我们就可以建表。

使用数据库并不是一件难事,难就难在如何建模。这里我们就只建三个简单的表:

Teacher(teacherId, name, classId), Student(studentId,name,classId),Class(classId,className,studentId,teacherId),其中teacherId,studentId,classId分别是Teacher,Student和Class的主键。

SQLite可以直接执行SQL语句,所以,我们可以这样建表:

 String CREATE_CLASS = "Create Table If Not Exists Class(classId integer primary key,"
                + "className varchar(100),"
                + "studentId integer References Student(studentId),"
                + "teacherId integer References Teacher(teacherId))";
 SQLiteDatabase db = helper.getWritableDatabase();
 db.execSQL(CREATE_CLASS);

每次使用完数据库都要记得及时关闭数据库:

 db.close();

按照上面的方法,我们可以很快的建好三个表。

二.Updata

更新这部分包括:插入,修改这两个动作。

先讲最基本的动作:插入。

我们现在要想将学生插入到班级中,像是这样:

 ClassInfoProvider provider = new ClassInfoProvider(this);
 Student student = new Student(2857, "郑文彪");
 ClassInfo classInfo = new ClassInfo("电信1班", 1);
 provider.addStudent(student, classInfo);

这里我们有三个类:

public class ClassInfo {
    private String name;
    private int id;

    public ClassInfo() {
    }

    public ClassInfo(String name, int id) {
        this.id = id;
        this.name = name;
    }

    public int getId() {
        return this.id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }
  }
public class Teacher {
    private int teacherId;
    private String name;
    private String className;

    public Teacher() {
    }

    public Teacher(int teacherId, String name) {
        this.name = name;
        this.teacherId = teacherId;
    }

    public int getTeacherId() {
        return this.teacherId;
    }

    public void setTeacherId(int teacherId) {
        this.teacherId = teacherId;
    }

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getClassName() {
        return this.className;
    }

    public void setClassName(String name) {
        this.className = name;
    }
}
public class Student {
    private int studendtd;
    private String name;
    private String className;

    public Student() {
    }

    public Student(int studentId, String name) {
        this.name = name;
        this.studentId = studentId;
    }

    public int getStudentId() {
        return this.studentId;
    }

    public void setStudendId(int studentId) {
        this.studentId = studendtd;
    }

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getClassName() {
        return this.className;
    }

    public void setClassName(String name) {
        this.className = name;
    }
}

这三个类就是存放Student,Teacher和Class的基本信息。
       然后我们开始将学生插入到班级中:

public void addStudent(Student student, ClassInfo classInfo) {
        String INSERT_STUDENT_INTO_CLASS = "Insert Into Class(className, studentId, classId) Values(‘" + classInfo.getName() + "‘,"
                + student.getStudentId() + "," + classInfo.getId() + ")";
        String INSERT_STUDENT = "Insert Into Student(studentId, name, classId) Values(" + student.getStudentId() + ","
                + "‘" + student.getName() + "‘," + classInfo.getId() + ")";
        SQLiteDatabase db = helper.getWritableDatabase();
        db.execSQL(INSERT_STUDENT);
        db.execSQL(INSERT_STUDENT_INTO_CLASS);
        db.close();
    }

这是直接执行SQL语句的做法。
       SQLiteOpenHelper封装了一个insert方法可以方便我们执行插入行为:

SQLiteDatabase db = helper.getWritableDatabase();
 ContentValues values = new ContentValues();
 values.put("className", classInfo.getName());
 values.put("studentId", student.getStudentId());
 values.put("classId", classInfo.getId());
 db.insert("Class", null, values);
 ContentValues values1 = new ContentValues();
 values1.put("studentId", student.getStudentId());
 values1.put("name", student.getName());
 values1.put("classId", classInfo.getId());
 db.insert("Student", null, values1);
 db.close();

ContentValues其实就是一个字典Map,key值就是表中的列值,而value就是对应的字段。insert方法的第一个参数是要插入的表名,第二个参数就是相应的列,这里我们用null表示所有的列,然后就是我们要插入的字段。
       这样的方法确实可以简化我们的操作,至少不用在我们的代码中写那么长的SQL语句,容易犯错,又很烦,尤其是在插入的动作不断执行的时候。但有个地方值得注意:如果我们的数据库是提供接口方法给其他模块使用,而且以后要修改的人或者查看的人并不是我们自己,他们可能就必须知道这些方法的参数是什么,但直接执行SQL语句,只要他有数据库的基础知识,就会明白这是在干嘛,也知道如何修改。更糟糕的情况就是以后android的接口方法发生变化的话,那么,这些代码可能就会出现问题。当然,我们愿意相信他们不会修改接口,因为对接口的修改是一种错误的行为,尤其在接口已经发布的情况下。

现在我们的表已经有数据了,如果我们想要修改的话,像是将学生的姓名进行更改,可以这样操作:

public void updateStudent(int id, String name) {
        SQLiteDatabase db = helper.getWritableDatabase();
        String UPDATE_STUDENT = "Update Student Set name =" + "‘" + name + "‘ Where id=" + id + "";
        db.execSQL(UPDATE_STUDENT);
        db.close();
}

当然,我们同样可以简化:

public void updateStudent(int id, String name) {
     SQLiteDatabase db = helper.getWritableDatabase();
     ContentValues values = new ContentValues();
     values.put("name", name);
     db.update("Student", values, "studentId=?", new String[]{id + ""});           db.close();
}

update方法中,值得注意的是最后面两个参数,whereClause和whereArgs。whereClause表示要修改哪里,whereArgs表示修改的字段,无论我们是要修改一个字段还是一个以上,这里都需要一个String[]。

三.Read
      所谓的Read,就是一系列查询动作。

我们要在Student这个表中查询名为"郑文彪"的学号,就是studentId:

public int getStudentId(String name) {
        int id = 0;
        String SELECT_STUDENTID = "Select studentId From Student Where name=?";
        SQLiteDatabase db = helper.getWritableDatabase();
        Cursor cursor = db.rawQuery(SELECT_STUDENTID, new String[]{name});
        if (cursor.moveToNext()) {
            id = cursor.getInt(0);
        }
        cursor.close();
        db.close();
        return id;
    }

这里我们需要利用光标Cursor。Cursor指向当前的数据记录,然后我们可以从光标中获取相应的数据。
四.Delete

Delete包括表的删除,数据记录的删除。

首先是数据记录的删除。现在我们想要删除姓名为"郑文彪"的学生的记录:

 public void deleteStudent(Student student) {
        SQLiteDatabase db = helper.getWritableDatabase();
        String DELETE_STUDENT = "Delete From Class Where studentId=?";
        db.execSQL(DELETE_STUDENT, new String[]{student.getStudentId() + ""});
        db.close();
    }

然后这样调用该方法:

 Student student = new Student(2857, "郑文彪");
 ClassInfo classInfo = new ClassInfo("电信1班", 1);
 provider.addStudent(student, classInfo);
 provider.deleteStudent(student1);

  同样可以简化:

  db.delete("Class", "studentId=?", new String[]{student.getStudentId() + ""});

接着是删除表,这个很简单:

String DROP_CLASS = "Drop Table Class";
SQLiteDatabase db = helper.getWritableDatabase();
db.execSQL(DROP_CLASS);

在做测试的时候,由于需要经常运行,所以数据库中表的数据会非常冗余,尤其是将键值设为自增的时候。所以,我们需要在每次测试后删除表,这样下次测试的时候就不会受到影响。

时间: 2024-08-28 12:36:56

android学习——数据库SQLite的基本操作的相关文章

七、Android学习第六天——SQLite与文件下载(转)

(转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 七.Android学习第六天——SQLite与文件下载 SQLite SQLite是Android内嵌的一个非常小的关系型数据库. 总结:当我们操作 在学习SQLite当中,遇到两个问题: (一)如果我们在搭建Android环境成功后,在命令行中输入adb后没有反应,可以按一下操作来做: 第一步:将platform-tools的目录加入path环境变量的配置中: 第二步:

Android学习之sqlite与listview

在android系统中使用的是sqlite数据库,前面的简易登录系统已经讲述了数据库的应用.本例的重点是实现数据库与listview的绑定.demo的数据是将个人的信息绑定到listview中,并存在sqlite. 1.person类 1 public class PersonInfo 2 { 3 public PersonInfo() 4 { 5 6 } 7 private String name; 8 private int age; 9 public void setNmae(String

Android通讯录数据库介绍与基本操作(增删改查)

Android通讯录数据库介绍与基本操作(增删改查) 2014年2月21日 Android通讯录管理总结 这几天导师安排我一个任务就是研究一下Android通讯录获取联系人.通话记录.短信的方法,还有看看不同Android版本之间的异同是否能做到兼容之类的事情.Android通讯录这一块,我个人感觉是挺乱的,网上一堆关于查询本地数据库获取联系人的方法,但似乎都没有仔细说明数据有哪些重要的表,它们之间有什么联系.下面是本人查询资料总结的一下知识点,方便童鞋们以后用到. http://xys2891

【转】afinal来操作android的数据库sqlite

今天给大家介绍下#afinal#来操作android的数据库sqlite. #afinal#是一个android的orm.ioc快速开发框架,里面包含了四大功能:空间的id绑定和事件绑定功能:网络图片的显示功能(里面包含了强大的缓存框架):数据库sqlite的操作功能:http数据的读取功能(支持ajax方式读取): #afinal#开源网址:https://github.com/yangfuhai/afinal 这篇文章主要是介绍afinal的功能之一FinalDb组件,其他组件请关注我的博客

Android学习笔记--Sqlite数据库

前几天学习了Android中的数据存储,包括文件存储,SharedPreferences存储,还有就是Acndroid中的特色:SQLite数据库存储了.让我比较惊讶的是Android中竟然内嵌了一个轻量型的数据库SQLite数据库,使得本地的数据持久化有了一个质的飞跃. 通过前两天上课听老师讲解,和课下自己看书总结,想在博客上把自己对于SQLite数据库的理解做一下总结,也是方便之后的复习.Android为了让我们能够更加方便的管理数据库,专门提供了SQLiteOpenHelper帮助类,这个

Android - 插入数据库(SQLite)错误

插入数据库(SQLite)错误 本文地址: http://blog.csdn.net/caroline_wendy Error: android.database.sqlite.SQLiteException: no such table: step (code 1): ,  while compiling: INSERT INTO step(duration,date,counter) VALUES (?,?,?). 错误:插入数据库错误,没有找到表,插入表的地方写入参数,而参数地方传入空值.

android 建数据库 SQLite 存储sd 卡或者内存

android 创建数据库调用SQLiteOpenHelper,一般不直接操作SQLiteDatabase . 是通过SQLiteOpenHelper来获取 public class DBOpenHelper extends SQLiteOpenHelper { private static final int VERSION = 1;// 定义数据库版本 private static final String PATH = Environment .getExternalStorageDire

android 本地数据库sqlite的封装

单机android   sqlite数据库的实现,这个数据库可与程序一起生成在安装包中 一.下载sqlite3.exe文件 二.运行 cmd 转到sqlite3.exe 所在目录  运行 sqlite3.exe 数据库名.db     然后会出现sqlite>的命令提示符 输入创建表的语句, create table 表名('列','列'...):(注意: 要在结束部分加  分号 )     此时会在sqlite3.exe 所在目录,出现所建数据库的文件 三.如果想在Android中运行的话,需

Android学习总结——SQLite

SQLiteDatabase类: 一.使用sql语句操作数据库 SQLiteDatabase db = openOrCreateDatabase("database.db", MODE_PRIVATE,null);// (数据库名称,权限,数据工厂) db.execSQL("create table if not exists usertb(_id integer primary key autoincrement,name text not null,age integer