Android学习笔记(7)——数据库Sqlite的使用

Sqlite是一种轻量级的嵌入式关系数据库,比一般的Mysql等速度更快,更适合在移动轻型移动设备上使用。它支持基本所有的Sql语句,使用非常方便。

在Android系统中,我们使用SqliteDatabase 的API来对其进行调用。本文就来介绍一下数据库的创建以及使用sql语句对数据库进行基本操作。

本文例子中建立了一个person的数据库,有3个字段,分别为id,name,numer,其中后两项为String类型。

首先是数据库的建立,我们新建一个PersonSQLiteOpenHelper去继承SQLiteOpenHelper,注释中解释了构造方法参数的含义.

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package com.xgezhang.sqlitetest;
 
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;
 
public class PersonSQLiteOpenHelper extends SQLiteOpenHelper {
 
     /**
      * 数据库构造方法
      * @param context 告诉程序数据库创建在哪一个目录下
      * @param name 数据库文件的名字
      * @param factory 数据结果集游标,null为默认
      * @param version   数据库版本,从1开始
      */
     public PersonSQLiteOpenHelper(Context context) {
         super (context, "Person.db" , null , 1 );
         // TODO Auto-generated constructor stub
     }
 
     /**
      *数据库第一次被创建时调用的方法
      */
     @Override
     public void onCreate(SQLiteDatabase db) {
         //初始化数据库表结构
         //嵌入式SQLite 底层存放数据都是已string方式存放
         db.execSQL( "create table person (id integer primary key autoincrement , name varchar(20) , number varchar(20))" );
     }
 
     @Override
     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
         // TODO Auto-generated method stub
         
     }
}

为了测试方便,我们建立了一个AndroidTestCase,首先测试一下数据库的建立是否成功:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
package com.xgezhang.sqlitetest.test;
 
import java.util.List;
 
import com.xgezhang.sqlitetest.PersonSQLiteOpenHelper;
import android.test.AndroidTestCase;
 
public class TestPersonDB extends AndroidTestCase {
 
     public void createDB() throws Exception {
         PersonSQLiteOpenHelper helper = new PersonSQLiteOpenHelper(getContext());
         helper.getWritableDatabase();
     }
 
}

运行测试代码,之后,我们可以打开DDMS的文件系统,查看/data/data/yourAppPackage/目录,如果生成成功,会出现一个databases文件夹,里面就有我们刚才创建的person.db文件。

SqlHelper的onCreate函数只在第一次执行的时候才创建,之后就不会再运行这段代码了。

接下来我们来看看如何对数据库进行操作,常见的操作无异于以下几种:

1.插入操作 insert

2.查找指定内容操作 select . where .

3.删除条目操作 delete . where .

4.更改条目 update .set . where .

5.查找所有 select * from person

为了代码的规范性,我们先定义好person的业务bean单元,新建package com.xgezhang.splitetest.domain,设置好Person的类:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package com.xgezhang.sqlitetest.domain;
 
public class   Person{
 
     private int id;
     private String name;
     private String numberString;
     
     public Person() {
     }
     
     public  Person( int id, String name, String numberString) {
         super ();
         this .id = id;
         this .name = name;
         this .numberString = numberString;
     }
     
     @Override
     public String toString() {
         return "Person [id=" + id + ", name=" + name + ", numberString="
                 + numberString + "]" ;
     }
 
     public int getId() {
         return id;
     }
     public void setId( int id) {
         this .id = id;
     }
     public String getName() {
         return name;
     }
     public void setName(String name) {
         this .name = name;
     }
     public String getNumberString() {
         return numberString;
     }
     public void setNumberString(String numberString) {
         this .numberString = numberString;
     }
}

然后新建一个dao(database access object)的package,写好类来对数据库进行操作,主要就是前面说到的几点。其中db.execSQL语句可以用来执行对应的SQL语句。而相应的查找则使用rawQuery函数来执行。二者都使用了带占位符的函数方式:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
package com.xgezhang.sqlitetest.dao;
 
import java.io.Closeable;
import java.util.ArrayList;
import java.util.List;
 
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
 
import com.xgezhang.sqlitetest.PersonSQLiteOpenHelper;
import com.xgezhang.sqlitetest.domain.Person;
 
public class PersonDao {
     private PersonSQLiteOpenHelper helper;
     
     public PersonDao(Context context) {
         helper = new PersonSQLiteOpenHelper(context);
     }
     
     /**
      * 添加一条记录到数据库
      * @param name 姓名
      * @param number 电话
      */
     public void add(String name,String number){
         SQLiteDatabase db = helper.getWritableDatabase();
         db.execSQL( "Insert into person(name,number) values (?,?)" , new Object[] {name,number});
         db.close();
     }
     
     /**
      * 查询记录是否存在
      * @param name 姓名
      * @return boolean类型,true存在 false不存在
      */
     public boolean find(String name){
         SQLiteDatabase db = helper.getReadableDatabase();
         Cursor cursor = db.rawQuery( " select * from person where name = ?" , new String[] {name});
         boolean bool = cursor.moveToNext();
         cursor.close();
         db.close();
         return bool;
     }
     
     /**
      *修改一条记录
      * @param name 要修改的人的姓名
      * @param number 修改后的新的号码
      */
     public void update(String name,String newNumber){
         SQLiteDatabase db = helper.getWritableDatabase();
         db.execSQL( "update person set number = ?' where name= ?" , new Object[] {newNumber,name});
         db.close();
     }
     /**
      * 删除一条数据
      * @param name 要删除的条目的姓名
      */
     public void delete(String name){
         SQLiteDatabase db = helper.getWritableDatabase();
         db.execSQL( "delete from person where name = ?" , new String[] {name});
         db.close();
     }
     
     /**
      * 返回全部的数据库信息
      * @return
      */
     public List<Person> findAll(){
         SQLiteDatabase db = helper.getReadableDatabase();
         Cursor cursor = db.rawQuery( "select * from person" , null );
         List<Person> persons = new ArrayList<Person>();
         
         while (cursor.moveToNext()){
             int id = cursor.getInt(cursor.getColumnIndex( "id" ));
             String name = cursor.getString(cursor.getColumnIndex( "name" )); //根据数据库栏的名字来获取对应的index ,增强程序的易读性
             String number = cursor.getString(cursor.getColumnIndex( "number" ));
             Person p  = new Person(id,name,number);
             persons.add(p);
         }
         
         cursor.close();
         db.close();
         return persons;
     }
}

注意一点,在查找的时候返回的cursor指向的是查找结果的最上面一行(即第一行数据的上面),我们可以用cursor.moveToNext() cursor.moveToPosition()等方法获取到需要的值。

写好以后,我们继续完善我们的TestCase:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
package com.xgezhang.sqlitetest.test;
 
import java.util.List;
 
import com.xgezhang.sqlitetest.PersonSQLiteOpenHelper;
import com.xgezhang.sqlitetest.dao.PersonDao;
import com.xgezhang.sqlitetest.domain.Person;
import android.test.AndroidTestCase;
 
public class TestPersonDB extends AndroidTestCase {
 
     public void createDB() throws Exception {
         PersonSQLiteOpenHelper helper = new PersonSQLiteOpenHelper(getContext());
         helper.getWritableDatabase();
     }
     
     public void testAdd() throws Exception{
         PersonDao dao  = new PersonDao(getContext());
         dao.add( "lisi" , "123" );
     }
     
     public void testFind() throws Exception{
         PersonDao dao  = new PersonDao(getContext());
         boolean result = dao.find( "lisi" );
         assertEquals( true , result);
     }
     
     public void testDelete() throws Exception{
         PersonDao dao  = new PersonDao(getContext());
         dao.delete( "lisi" );
     }
     
     public void testUpdate() throws Exception{
         PersonDao dao  = new PersonDao(getContext());
         dao.update( "lisi" , "123456" );
     }
     
     public void testFindAll() throws Exception{
         PersonDao dao  = new PersonDao(getContext());
         List<Person> persons =dao.findAll();
         for (Person p: persons){
             System.out.print(p.toString());
         }
     }
}

同时API还提供了很多内置的方法,例如insert,delete等。也可以直接用,总之Android下使用SQLite还是非常方便的。

搬运自本人博客,xge技术博客

http://www.xgezhang.com/android_sqlite.html


欢迎转载,请注明出处。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值