首页 > 代码库 > 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 }
或者将 PersonSQliteOpenHelper改成:
1 public PersonSQliteOpenHelper(Context context) {2 super(context, "person.db", null, 4);3 }
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 }
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 }
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);
④.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 }
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 }
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);
④.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 }
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 }
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 }
①.通过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 }
⑤.最后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 }
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 }
Android学习笔记_数据库(SQLite)