首页 > 代码库 > Android学习笔记_数据库(SQLite)

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, CursorFactory12      * 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     @Override20     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     @Override11     public String toString() {12         return "Person [id=" + id + ", name=" + name + ", number=" + number13                 + "]";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

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