1. 程式人生 > >android開發中的資料庫SQLite的使用

android開發中的資料庫SQLite的使用

其實學習android很久了,關於資料儲存,之前學習的時候也一同學習過,程式設計這些東西很久沒用都忘得差不多了,最近做個專案要用到,所以又學習了一遍。

android中關於資料的儲存有好幾種,這次主要是SQLite的使用。

首先說一點,我的技術很爛,原理什麼的不說了,就是講一下怎麼使用,包括“增刪改查”這幾個操作。

使用資料庫的前提是有資料庫,有表,所以我們首先是要有一個數據庫,然後還得建一張表(至少一張表)。sql語句就是“create table XXX()”。作為一個數據庫系統,SQLite也是遵守SQL92標準的,和其他的資料庫都差不多,所以有過資料庫開發經驗的對這些sql語句都不陌生。

  開發中使用資料庫

  建立資料庫

      android中提供了SQLiteOpenHelper這個類來幫助你管理資料庫。包括建立和更新資料庫。所以你只要繼承SQLiteOpenHelper類來對資料庫進行管理就行。

複製程式碼

public class DBHelper extends SQLiteOpenHelper {
    private static final String DATABASE_NAME = "test.db";
    private static final int DATABASE_VERSION = 1;
    public DBHelper(Context context){
        super(context,DATABASE_NAME,null,DATABASE_VERSION);
    }

    @Override
    public void onCreate(SQLiteDatabase db){
        db.execSQL("CREATE TABLE IF NOT EXISTS person(_id INTEGER PRIMARY KEY AUTOINCREMENT," +
                " name VARCHAR,age INTEGER, info TEXT)");//建表,對資料庫進行操作等

    }

    @Override
    public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion){
        db.execSQL("ALTER TABLE person COLUMN other STRING");
    }
}

複製程式碼

SQLiteOpenHelper類的建構函式有四個引數
public SQLiteOpenHelper(Context context, String name, CursorFactory factory, int version) {
        this(context, name, factory, version, null);
    }

這是我在sdk原始碼SQLiteOpenHelper類中複製的。context代表上下文,name是資料庫名字,factory是遊標工廠,一般情況下為null值,version是資料庫版本,軟體在今後的升級中會用到。

  在建構函式中就會建立資料庫。

  使用資料庫

  資料庫已經建立好,通常我們通過getReadAbleDatabase()或getWriteableDatabase()方法來獲取一個數據庫例項。可以在onCreate()方法中對資料庫進行操作。不過為了便於管理,還是建議大家重新寫一個專門的工具類。

  建立表

其實在onCreate()方法中就是在建立表。

db.execSQL("CREATE TABLE IF NOT EXISTS person(_id INTEGER PRIMARY KEY AUTOINCREMENT," +
                " name VARCHAR,age INTEGER, info TEXT)");
表名是person,_id是主鍵,為自增長,name是verchar型,age是integer型,info是text型。

   表操作

  表的操作就是增刪改查,android中提供了兩種方法(就我知道的)。分別是sql語句和封裝好的insert(),delete(),update(),query()。後邊的這些方法也是對sql語句的封裝。

    

  db.execSQL("insert into ....");  

  還有就是

  ContentValues cv = new ContentValues();

  cv.put();

  cv.put();

  db.insert("tableName",getNullColunmHack(),cv);

  函式原型是insert(String table, String nullColumnHack, ContentValues values),其實insert()的底層也是execSQL()。

  刪

  和新增的操作差不多。db.execSQL()和db.delete()

  改

  和上邊兩個操作的也是相同的。

  查

  因為查詢的結果是返回一個遊標(Cursor)。rawQuery(String sql, String[] selectionArgs)。通過移動遊標來進行資料的查詢。

複製程式碼

 1         Cursor c = db.rawQuery("SELECT * FROM person", null);
 2         while(c.moveToNext()){
 3             Person p = new Person();
 4             p.set_id(c.getInt(c.getColumnIndex("_id")));
 5             p.setName(c.getString(c.getColumnIndex("name")));
 6             p.setAge(c.getInt(c.getColumnIndex("age")));
 7             p.setInfo(c.getString(c.getColumnIndex("info")));
 8             persons.add(p);
 9         }
10         c.close();                

複製程式碼

所有的操作也差不多就是這些。

最後新增幾張截圖。

最後是全部原始碼

activity.java

複製程式碼

  1 package com.sqlitedemo.activity;
  2 
  3 import android.app.Activity;
  4 import android.os.Bundle;
  5 import android.view.View;
  6 import android.widget.Button;
  7 import android.widget.ListView;
  8 import android.widget.SimpleAdapter;
  9 import android.widget.Toast;
 10 
 11 import com.tiancz.sqlitedemo.R;
 12 import com.tiancz.sqlitedemo.com.tiancz.sqlitedemo.activity00_entity.DBManager;
 13 import com.tiancz.sqlitedemo.com.tiancz.sqlitedemo.activity00_entity.Person;
 14 
 15 import java.util.ArrayList;
 16 import java.util.HashMap;
 17 import java.util.List;
 18 import java.util.Map;
 19 
 20 /**
 21  * Created by tiancz on 2015/3/7.
 22  */
 23 public class activity00 extends Activity {
 24 
 25     private DBManager dm;
 26     private ListView lv;
 27 
 28     private Button add;
 29     private Button query;
 30     private Button update;
 31     private Button delete;
 32     private Button drop;
 33     @Override
 34     protected void onCreate(Bundle savedInstanceState) {
 35         super.onCreate(savedInstanceState);
 36         setContentView(R.layout.activity00);
 37 
 38         lv = (ListView)findViewById(R.id.lv_00);
 39         query = (Button)findViewById(R.id.query00);
 40         add = (Button)findViewById(R.id.add00);
 41         update = (Button)findViewById(R.id.update00);
 42         delete = (Button)findViewById(R.id.deleteAll00);
 43         drop = (Button)findViewById(R.id.drop00);
 44 
 45         dm = new DBManager(this);
 46 
 47         add.setOnClickListener(new View.OnClickListener() {
 48             @Override
 49             public void onClick(View v) {
 50                 add(v);
 51             }
 52         });
 53 
 54         query.setOnClickListener(new View.OnClickListener() {
 55             @Override
 56             public void onClick(View v) {
 57                 query(v);
 58             }
 59         });
 60 
 61         update.setOnClickListener(new View.OnClickListener() {
 62             @Override
 63             public void onClick(View v) {
 64                 update(v);
 65             }
 66         });
 67 
 68         delete.setOnClickListener(new View.OnClickListener() {
 69             @Override
 70             public void onClick(View v) {
 71                 deleteALL(v);
 72             }
 73         });
 74 
 75 //        drop.setOnClickListener(new View.OnClickListener() {
 76 //            @Override
 77 //            public void onClick(View v) {
 78 //                dropTable(v);
 79 //            }
 80 //        });
 81     }
 82 
 83 
 84     @Override
 85     protected void onDestroy(){
 86         super.onDestroy();
 87         dm.closeDB();
 88     }
 89 
 90     public void add(View view){
 91         List<Person> persons = new ArrayList<>();
 92         Person p1 = new Person("tom",21,"lively boy");
 93         Person p2 = new Person("bill",23,"handsome");
 94         Person p3 = new Person("gate",22,"sexy boy");
 95         Person p4 = new Person("joe",24,"hot boy");
 96         Person p5 = new Person("jhon",29,"pretty");
 97 
 98         persons.add(p1);
 99         persons.add(p2);
100         persons.add(p3);
101         persons.add(p4);
102         persons.add(p5);
103 
104         dm.add(persons);
105     }
106     public void update(View view){
107         Person p = new Person();
108         p.setName("jhon");
109         p.setAge(40);
110         dm.updateAge(p);
111     }
112 
113     public void deleteALL(View view){
114         dm.delete();
115     }
116 
117     public void delete(View view){
118         Person p = new Person();
119         p.setAge(30);
120         dm.deleteOldPerson(p);
121     }
122 
123 //    public void dropTable(View view){
124 //        dm.dropTable();
125 //    }
126 
127     public void query(View view){
128         List<Person>persons    = dm.findAllPerson();
129         ArrayList<Map<String,String>> list = new ArrayList<>();
130         for (Person p:persons){
131             HashMap<String,String>map = new HashMap<>();
132             map.put("name",p.getName());
133             map.put("info","No."+p.get_id()+" "+p.getAge()+" years old,"+p.getInfo());
134             list.add(map);
135         }
136         SimpleAdapter adapter = new SimpleAdapter(this,list,android.R.layout.simple_list_item_2,
137                 new String[]{"name","info"},new int[]{android.R.id.text1,android.R.id.text2});
138         lv.setAdapter(adapter);
139         if(list.isEmpty()){
140             Toast.makeText(this,"列表裡還沒人呢",Toast.LENGTH_SHORT).show();
141         }
142     }
143 }

複製程式碼

activity.xml

複製程式碼

 1 <?xml version="1.0" encoding="utf-8"?>
 2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
 3               android:layout_width="match_parent"
 4               android:layout_height="match_parent"
 5               android:orientation="vertical">
 6 
 7     <Button
 8         android:id="@+id/add00"
 9         android:layout_width="wrap_content"
10         android:layout_height="wrap_content"
11         android:text="Add"/>
12     <Button
13         android:id="@+id/update00"
14         android:layout_width="wrap_content"
15         android:layout_height="wrap_content"
16         android:text="update"/>
17     <Button
18         android:id="@+id/deleteAll00"
19         android:layout_width="wrap_content"
20         android:layout_height="wrap_content"
21         android:text="deleteAll"/>
22     <Button
23         android:id="@+id/delete00"
24         android:layout_width="wrap_content"
25         android:layout_height="wrap_content"
26         android:text="delete"/>
27     <Button
28         android:id="@+id/drop00"
29         android:layout_width="wrap_content"
30         android:layout_height="wrap_content"
31         android:text="drop"/>
32     <Button
33         android:id="@+id/query00"
34         android:layout_width="wrap_content"
35         android:layout_height="wrap_content"
36         android:text="query"/>
37 
38     <ListView
39         android:id="@+id/lv_00"
40         android:layout_width="fill_parent"
41         android:layout_height="wrap_content">
42     </ListView>
43 </LinearLayout>

複製程式碼

DBHelper.java

複製程式碼

 1 package com.tiancz.sqlitedemo.com.tiancz.sqlitedemo.activity00_entity;
 2 
 3 import android.content.Context;
 4 import android.database.sqlite.SQLiteDatabase;
 5 import android.database.sqlite.SQLiteOpenHelper;
 6 
 7 /**
 8  * Created by tiancz on 2015/3/8.
 9  */
10 public class DBHelper extends SQLiteOpenHelper {
11     private static final String DATABASE_NAME = "test.db";
12     private static final int DATABASE_VERSION = 1;
13     public DBHelper(Context context){
14         super(context,DATABASE_NAME,null,DATABASE_VERSION);
15     }
16 
17     @Override
18     public void onCreate(SQLiteDatabase db){
19         db.execSQL("CREATE TABLE IF NOT EXISTS person(_id INTEGER PRIMARY KEY AUTOINCREMENT," +
20                 " name VARCHAR,age INTEGER, info TEXT)");
21 
22     }
23 
24     @Override
25     public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion){
26         db.execSQL("ALTER TABLE person COLUMN other STRING");
27     }
28 }

複製程式碼

DBManager.java

複製程式碼

 1 package com.tiancz.sqlitedemo.com.tiancz.sqlitedemo.activity00_entity;
 2 
 3 import android.content.ContentValues;
 4 import android.content.Context;
 5 import android.database.Cursor;
 6 import android.database.sqlite.SQLiteDatabase;
 7 
 8 import java.util.ArrayList;
 9 import java.util.List;
10 
11 /**
12  * Created by tiancz on 2015/3/8.
13  */
14 public class DBManager {
15     private DBHelper helper;
16     private SQLiteDatabase db;
17 
18     public DBManager(Context context){
19         helper = new DBHelper(context);
20         db = helper.getWritableDatabase();
21     }
22 
23     public void add(List<Person> persons){
24         db.beginTransaction();
25         try{
26             for (Person p:persons){
27                 db.execSQL("INSERT INTO person VALUES(null,?,?,?)",
28                         new Object[]{p.getName(),p.getAge(),p.getInfo()});
29             }
30             db.setTransactionSuccessful();
31         }catch(Exception e){
32             e.printStackTrace();
33         }finally {
34             db.endTransaction();
35         }
36     }
37 
38     public void updateAge(Person p){
39         ContentValues cv = new ContentValues();
40         cv.put("age",p.getAge());
41         db.update("person",cv,"name=?",new String[]{p.getName()});
42     }
43 
44     public void delete(){
45         db.execSQL("delete from person where name='tom'");
46         db.execSQL("delete from person where name='bill'");
47         db.execSQL("delete from person where name='gate'");
48         db.execSQL("delete from person where name='joe'");
49         db.execSQL("delete from person where name='jhon'");
50     }
51 
52     public void deleteOldPerson(Person p){
53         db.delete("person","age=?",new String[]{String.valueOf(p.getAge())});
54     }
55 
56     public List<Person> findAllPerson(){
57         ArrayList<Person> persons = new ArrayList<Person>();
58         Cursor c = db.rawQuery("SELECT * FROM person", null);
59         while(c.moveToNext()){
60             Person p = new Person();
61             p.set_id(c.getInt(c.getColumnIndex("_id")));
62             p.setName(c.getString(c.getColumnIndex("name")));
63             p.setAge(c.getInt(c.getColumnIndex("age")));
64             p.setInfo(c.getString(c.getColumnIndex("info")));
65             persons.add(p);
66         }
67         c.close();
68         return persons;
69     }
70 
71 //    public void dropTable(){
72 //        db.execSQL("drop table person");
73 //    }
74 
75     public void closeDB(){
76         db.close();
77     }
78 
79 
80 }

複製程式碼

Person.java

複製程式碼

 1 package com.tiancz.sqlitedemo.com.tiancz.sqlitedemo.activity00_entity;
 2 
 3 /**
 4  * Created by tiancz on 2015/3/8.
 5  */
 6 public class Person {
 7     private int _id;
 8     private String name;
 9     private int age;
10     private String info;
11 
12     public Person(){}
13 
14     public Person(String name,int age,String info){
15         this.name=name;
16         this.age=age;
17         this.info=info;
18     }
19 
20     public int get_id() {
21         return _id;
22     }
23 
24     public void set_id(int _id) {
25         this._id = _id;
26     }
27 
28     public int getAge() {
29         return age;
30     }
31 
32     public void setAge(int age) {
33         this.age = age;
34     }
35 
36     public String getName() {
37         return name;
38     }
39 
40     public void setName(String name) {
41         this.name = name;
42     }
43 
44     public String getInfo() {
45         return info;
46     }
47 
48     public void setInfo(String info) {
49         this.info = info;
50     }
51 }

複製程式碼

這就是全部的程式碼。

  總結

  剛開始做的時候忘了例項化DBManager,所以導致無法對資料庫進行操作,一直顯示的空指標異常,看了好久才發現忘了這一句

  dm = new DBManager(this);

  對於資訊越來越多,資料庫的使用越發顯得重要。學習android,資料庫的學習必不可少。