Android学习笔记_数据库(SQLite)(一)

一、使用SQLiteOpenHelper帮助类创建或管理(更新)数据库。

  为了便于项目管理,创建SQLiteOpenHelper帮助类的子类是最好是新建一个class。

  1、创建一个子类继承SQLiteOpenHelper帮助类,实现onCreate(SQLiteDatabase db)、onUpgrade(SQLiteDatabase db,int oldVersion,int new Version)两个方法,并添加一个构造方法 PersonSQliteOpenHelper(...){...}

构造方法 PersonSQliteOpenHelper代码:

1 public PersonSQliteOpenHelper(Context context, String name,
2             CursorFactory factory, int version) {
3         super(context, name, factory, version);
4     }
View Code

或者将 PersonSQliteOpenHelper改成:

1 public PersonSQliteOpenHelper(Context context) {
2         super(context, "person.db", null, 4);
3     }
View Code

     super(context, "person.db", null, 1)中context代表上下文, "person.db"为数据库名称,null指使用系统默认的游标工厂(结果集:cursor object),1为版本号(必须大于等于1)。

  2、onCreate(SQLiteDatabase db){}方法,当数据库第一次创建时调用,用于创建表结构、表数据等初始化操作,参数db是被创建的数据库。

利用db的execSQL(sql)方法初始化数据表结构,参数sql使用SQL语句。创建的SQL语句:CREATE TABLE person (id integer primary key autoincrement,name varchar(20),number varchar(20))。

onCreate(SQLiteDatabase db){}方法代码:

1 public void onCreate(SQLiteDatabase db) {
2          db.execSQL("CREATE TABLE person (id integer primary key autoincrement,name varchar(20),sex vachar(4),number varchar(20))");
3     }
View Code

  3、新建类PersonSQliteOpenHelper的源代码如下:

 1 package com.example.db;
 2 
 3 import android.content.Context;
 4 import android.database.sqlite.SQLiteDatabase;
 5 import android.database.sqlite.SQLiteDatabase.CursorFactory;
 6 import android.database.sqlite.SQLiteOpenHelper;
 7 import android.util.Log;
 8 
 9 public class PersonSQliteOpenHelper extends SQLiteOpenHelper {
10     /*
11      * public PersonSQliteOpenHelper(Context context, String name, CursorFactory
12      * factory, int version) { super(context, name, factory, version); }
13      */
14 
15     public PersonSQliteOpenHelper(Context context) {
16         super(context, "person.db", null, 1);
17     }
18 
19     @Override
20     public void onCreate(SQLiteDatabase db) {
21          db.execSQL("CREATE TABLE person (id integer primary key autoincrement,name varchar(20),sex vachar(4),number varchar(20))");
22     }
View Code

   4、在Activity中通过PersonSQliteOpenHelper helper = new PersonSQliteOpenHelper(this);和SQLiteDatabase db = helper.getWritableDatabase();两句语句的共同使用才能创建一个可写的数据库。

  5、导出后可用SQLiteExpertSetup应用查看db数据库。

二、实现数据库的增、删、改、查等方法。

  为了便于项目管理,新建一个class(名为PersonDao),并由改class实现增、删、改、查等方法。

  1、要对数据库进行操作,则先要拿到数据库的实例,而且是在PersonDao对象被创建时就拿到数据库实例。因此,在class PersonDao中需要定义一个PersonSQliteOpenHelper对象,并实现PersonDao的构造方法。如果该构造方法想创建对象,则必须传递进来一个上下文(Context),即构造方法以Context为参数。再在PersonDao构造方法中初始化PersonSQliteOpenHelper对象。

代码如下:

public class PersonDao2 {
	private PersonSQliteOpenHelper helper;
	
	public PersonDao2(Context context){
		helper = new PersonSQliteOpenHelper(context);
	}
}

  2、添加一条记录到数据库。

    ①.通过PersonSQliteOpenHelper对象的getWritableDatabase()方法拿到数据库对象(SQLiteDatabase)db。

    ②.通过数据库对象的insert(table, nullColumnHack, values)方法实现增加操作。参数中table是要增加的数据表名称;nullColumnHack当values参数为空或者里面没有内容的时候,我们insert是会失败的(底层数据库不允许插入一个空行),为了防止这种情况,我们要在这里指定一个列名,到时候如果发现将要插入的行为空行时,就会将你指定的这个列名的值设为null,然后再向数据库中插入;values,一个ContentValues对象,类似一个map集合,通过键值对的形式存储值,key是列名,value是列的值。

    ③.在insert之前创建一个ContentValues对象,并通过ContentValues对象(values)中put(key, value)方法放入键和相应的值,代码如下:

1 ContentValues values = new ContentValues();
2         values.put("name", name);
3         values.put("number",number);
4         values.put("account",money);
View Code

    ④.insert方法有个long类型的返回值,其值表示新插入行的ID,返回-1表示添加时出现错误。因此,通过系统api(insert)实现添加的方法可以有long类型的返回值。

采用insert方法添加记录到数据库的代码如下:

 1 public long add(String name,String number,int money){
 2         SQLiteDatabase db = helper.getWritableDatabase();
 3         ContentValues values = new ContentValues();
 4         values.put("name", name);
 5         values.put("number",number);
 6         values.put("account",money);
 7         long  id = db.insert("person", null, values);
 8         db.close();
 9         return id;
10     }
View Code

  3、查询数据库

    ①.通过PersonSQliteOpenHelper对象的getWritableDatabase()方法拿到数据库对象(SQLiteDatabase)db。

    ②.通过数据库对象的query(table, columns, selection, selectionArgs, groupBy, having, orderBy)方法实现查询操作。参数中:table要查询的表名; columns是一个String数组,表示要查询哪些列的内容,放入null表示查询所有列; selection是一个String数组,表示选择条件,也就是SOL语句中的WHERE后面的内容,用占位符“?”替代选择条件的值; selectionArgs是一个String类型的数组,也就是占位符对应的参数;groupBy, having, orderBy也就是SOL语句中的分组查询、排序等,如果不需要可以塞入null。

    ③.query方法的返回值是一个Cursor的结果集。Cursor的结果集可理解为查询结果表的条目编号,利用Cursor里的moveToNext()方法判断后面还有没有条目,若有则该方法返回true。Cursor结果集用完之后也要close。

查询数据库代码:

1 public boolean find(String name){
2         SQLiteDatabase db = helper.getReadableDatabase();
3         Cursor cursor = db.query("person", null, "name=?", new String[]{name}, null, null, null);
4         boolean result = cursor.moveToNext();
5         cursor.close();
6         db.close();
7         return result;
8     }
View Code

   4、更新数据库   

    ①.通过PersonSQliteOpenHelper对象的getWritableDatabase()方法拿到数据库对象(SQLiteDatabase)db。

    ②.通过数据库对象的update(table, values, whereClause, whereArgs)方法实现更新操作。参数中:table要更新的表名;values一个ContentValues对象,类似一个map集合,表示要更新的数据,通过键值对的形式存储值,key是列名,value是列的值;whereClause表示选择条件,用占位符“?”替代选择条件的值;whereArgs表示选择条件的值。

    ③.在update之前创建一个ContentValues对象,并通过ContentValues对象(values)中put(key, value)方法放入键和相应的值,key为要修改的列名,value为新的值,代码如下:

1 ContentValues values = new ContentValues();
2         values.put("number", newnumber);
View Code

 

     ④.update方法的返回值是一个int类型的值,表示更新的行数。将该值返回就可以知道更新是否成功,以及更新了多少行。

更新数据库的代码:

1 public int update(String name,String newnumber){
2         SQLiteDatabase db = helper.getWritableDatabase();
3         ContentValues values = new ContentValues();
4         values.put("number", newnumber);
5         int number = db.update("person", values, "name=?", new String[]{name});
6         db.close();
7         return number;
8     }
View Code

 

  5、删除    

    ①.通过PersonSQliteOpenHelper对象的getWritableDatabase()方法拿到数据库对象(SQLiteDatabase)db。

    ②.通过数据库对象的db.delete(table, whereClause, whereArgs)方法实现删除操作。参数中:table表示要删除数据的表名;whereClause表示选择条件,用占位符“?”替代选择条件的值;whereArgs表示选择条件的值。

    ③.delete方法有个int类型的返回值,表示影响的行数,删除成功则返回行数,删除失败则返回0。最后要close数据库db。

删除数据的代码:

1     public int delete(String name){
2         SQLiteDatabase db = helper.getWritableDatabase();
3         int number = db.delete("person", "name=?", new String[]{name});
4         db.close();
5         return number;
6     }
View Code

 

  6、查询数据库中所有内容。为了便于演示,查询出来的结果的用一个person集合(List<Person>)表示。因此需要创建一个新的类,取名person,person类中有id、name、number三个属性,并生成这三个属性的get、set方法,和相应的构造方法。其代码如下:

 1 public class Person {
 2     private int id;
 3     private String name;
 4     private String number;
 5     
 6     public Person() {
 7         
 8     }
 9 
10     @Override
11     public String toString() {
12         return "Person [id=" + id + ", name=" + name + ", number=" + number
13                 + "]";
14     }
15 
16     public Person(int id, String name, String number) {
17         super();
18         this.id = id;
19         this.name = name;
20         this.number = number;
21     }
22 
23     public int getId() {
24         return id;
25     }
26 
27     public void setId(int id) {
28         this.id = id;
29     }
30     
31     public String getName() {
32         return name;
33     }
34     
35     public void setName(String name) {
36         this.name = name;
37     }
38     
39     public String getNumber() {
40         return number;
41     }
42     
43     public void setNumber(String number) {
44         this.number = number;
45     }
46     
47 
48 }
View Code

 

    ①.通过PersonSQliteOpenHelper对象的getreadableDatabase()方法拿到数据库对象(SQLiteDatabase)db。    

    ②.new一个person类型的List集合。通过数据库对象的query方法完成查询,其中有个query方法的第一个参数是个boolean类型的distinct,它表示是否过滤重复内容。其他参数可参照查询的介绍。

    ③.查询后返回的是一个Cursor的结果集,通过while循环遍历整个结果集,while条件是cursor.moveToNext()(当移到最后一个时则返回false)。

    ④.在while循环中,通过Cursor的结果集的getInt(columnIndex)方法、getString(columnIndex)方法可以将所需要的列(columnIndex列)的值作为int类型、String类型返回,参数columnIndex表示目标列的下标,int类型。但是目标列的下标不知道而且可变,所以可以采用Cursor的结果集的getColumnIndex(columnName)方法来得到目标列的下标,参数columnName表示列名。最后new一个person对象,并将返回的相关数据放入person对象中。然后将person对象add到person类型的集合中。

while代码如下:

1 while(cursor.moveToNext()){
2             int id = cursor.getInt(cursor.getColumnIndex("id"));
3             String name = cursor.getString(cursor.getColumnIndex("name"));
4             String number = cursor.getString(cursor.getColumnIndex("number"));
5             Person p =new Person(id,name,number);
6             persons.add(p);
7         }
View Code

    ⑤.最后close数据库和Cursor的结果集。

查询所有数据信息的代码:

 1 public List<Person> findAll(){
 2         SQLiteDatabase db = helper.getReadableDatabase();
 3         List<Person> persons = new ArrayList<Person>();
 4         //Cursor cursor = db.rawQuery("select * from person", null);
 5         Cursor cursor = db.query("person", new String[]{"name","id","number"}, null, null, null, null, null);
 6         while(cursor.moveToNext()){
 7             int id = cursor.getInt(cursor.getColumnIndex("id"));
 8             String name = cursor.getString(cursor.getColumnIndex("name"));
 9             String number = cursor.getString(cursor.getColumnIndex("number"));
10             Person p =new Person(id,name,number);
11             persons.add(p);
12         }
13         cursor.close();
14         db.close();
15         return persons;
16     }
17     
18 }
View Code

 

  7、数据库增、删、改、查类的代码:

 1 public class PersonDao2 {
 2     private PersonSQliteOpenHelper helper;
 3     
 4     public PersonDao2(Context context){
 5         helper = new PersonSQliteOpenHelper(context);
 6     }
 7     
 8     public long add(String name,String number,int money){
 9         SQLiteDatabase db = helper.getWritableDatabase();
10         ContentValues values = new ContentValues();
11         values.put("name", name);
12         values.put("number",number);
13         values.put("account",money);
14         long  id = db.insert("person", null, values);
15         db.close();
16         return id;
17     }
18     
19     public boolean find(String name){
20         SQLiteDatabase db = helper.getReadableDatabase();
21         Cursor cursor = db.query("person", null, "name=?", new String[]{name}, null, null, null);
22         boolean result = cursor.moveToNext();
23         cursor.close();
24         db.close();
25         return result;
26     }
27     
28     public int update(String name,String newnumber){
29         SQLiteDatabase db = helper.getWritableDatabase();
30         ContentValues values = new ContentValues();
31         values.put("number", newnumber);
32         int number = db.update("person", values, "name=?", new String[]{name});
33         db.close();
34         return number;
35     }
36     
37     public int delete(String name){
38         SQLiteDatabase db = helper.getWritableDatabase();
39         int number = db.delete("person", "name=?", new String[]{name});
40         db.close();
41         return number;
42     }
43     
44     public List<Person> findAll(){
45         SQLiteDatabase db = helper.getReadableDatabase();
46         List<Person> persons = new ArrayList<Person>();
47         Cursor cursor = db.query("person", new String[]{"name","id","number"}, null, null, null, null, null);
48         while(cursor.moveToNext()){
49             int id = cursor.getInt(cursor.getColumnIndex("id"));
50             String name = cursor.getString(cursor.getColumnIndex("name"));
51             String number = cursor.getString(cursor.getColumnIndex("number"));
52             Person p =new Person(id,name,number);
53             persons.add(p);
54         }
55         cursor.close();
56         db.close();
57         return persons;
58     }
59     
60 }
View Code
posted @ 2015-01-10 14:51  红烧大白鲨  阅读(304)  评论(0编辑  收藏  举报