你的位置:首页 > 操作系统

[操作系统]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.

 1 <? 2 <LinearLayout  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   <Button13     android:id="@+id/update00"14     android:layout_width="wrap_content"15     android:layout_height="wrap_content"16     android:text="update"/>17   <Button18     android:id="@+id/deleteAll00"19     android:layout_width="wrap_content"20     android:layout_height="wrap_content"21     android:text="deleteAll"/>22   <Button23     android:id="@+id/delete00"24     android:layout_width="wrap_content"25     android:layout_height="wrap_content"26     android:text="delete"/>27   <Button28     android:id="@+id/drop00"29     android:layout_width="wrap_content"30     android:layout_height="wrap_content"31     android:text="drop"/>32   <Button33     android:id="@+id/query00"34     android:layout_width="wrap_content"35     android:layout_height="wrap_content"36     android:text="query"/>37 38   <ListView39     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   @Override18   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   @Override25   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 }

DBManager.java

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 }

Person.java

这就是全部的代码。

  总结

  刚开始做的时候忘了实例化DBManager,所以导致无法对数据库进行操作,一直显示的空指针异常,看了好久才发现忘了这一句

  dm = new DBManager(this);

  对于信息越来越多,数据库的使用越发显得重要。学习android,数据库的学习必不可少。