android資料庫儲方式(一)—-SQLite的基本操作

來源:互聯網
上載者:User

      最近開始在某個項目中實習,充分認識到了自己的不足,包括能力和性格等各種方面的缺陷。如何快速掌握開發環境,如何與其他程式員溝通交流,如何準確知道分配給自己的模組具體實現的功能等等,都是大問題,更重要的是,自己不能僅僅只是寫代碼而已,還要清楚自己的代碼的應用環境,別人是怎樣用的,自己應該提供哪些介面。這就屬於擴充性的問題,不是一個新手能夠馬上明白的,但卻是我們是否能夠“脫農”的關鍵。

      廢話不多說,本文講訴的是我在項目中使用到的新知識---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完全是現學現做,所以瞭解得並不是很深,寫得是一般,但還請各位能夠指出不足之處。

      

       
       

       

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.