• android数据库储方式(一)SQLite的基本操作


          最近开始在某个项目中实习,充分认识到了自己的不足,包括能力和性格等各种方面的缺陷。如何快速掌握开发环境,如何与其他程序员沟通交流,如何准确知道分配给自己的模块具体实现的功能等等,都是大问题,更重要的是,自己不能仅仅只是写代码而已,还要清楚自己的代码的应用环境,别人是怎样用的,自己应该提供哪些接口。这就属于扩展性的问题,不是一个新手能够马上明白的,但却是我们是否能够“脱农”的关键。

          废话不多说,本文讲诉的是我在项目中使用到的新知识---android数据库的操作。以前并没有任何关于android数据库的开发经历,所有的东西都是现学现用,所以特意总结一下。

          如果想要在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);

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

         SQLite完全是现学现做,所以了解得并不是很深,写得是一般,但还请各位能够指出不足之处。


          

           
           

           

  • 相关阅读:
    $GLOBALS超级全局变量
    归来
    Mscorlib.dll 里的 System.Internal 类是干嘛的?
    Query Composition using Functional Programming Techniques in C# 3.0
    反射之人千万不能错过的 EmitHelper
    给自己的Blog程序添加对Windows Live Writer的支持
    WebService的应用之winform身份验证
    c# static 的全部用法收集整理
    ASP.NET设置网站图标
    C# 2.0 之 static class (转)
  • 原文地址:https://www.cnblogs.com/wenjiang/p/3100860.html
Copyright © 2020-2023  润新知