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, 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 }
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 @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 }
①.通过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 }
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。