Android SQLite总结()

郑海波 2012-08-21 转载请声明:http://blog.csdn.net/nuptboyzhb/article/details/7891887

前言

对于Android平台来说,系统内置了丰富的API来供开发人员操作SQLite,我们可以轻松的完成对数据的存取。下面就向大家介绍一下SQLite常用的操作方法。本篇文章主要用到SQLiteDatabase的一些函数。废话少说,直接贴代码!由于数据库中操作的对象时Student类,因此我们看一下Student.java代码

package com.example.njupt.zhb.sqlite1;import java.lang.String;public class Student {    int _id;//与所建立的表对应String name;    int age;    int grade;    String info;public Student(String name,int age,int grade,String info){this.name=name;this.age=age;this.grade=grade;this.info=info;}public Student(){}}


Student类的定义可以看出,它有5个成员变量,其中第一个成员变量是其‘主键’,这个名称与数据库中主键要完全一致。

下面我们看一下MainActivity.java代码:

package com.example.njupt.zhb.sqlite1;import java.util.ArrayList;import java.util.List;import android.os.Bundle;import android.util.Log;import android.widget.ArrayAdapter;import android.widget.Button;import android.widget.ListView;import android.widget.Toast;import android.app.Activity;import android.content.ContentValues;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;import android.view.View;import android.view.View.OnClickListener;public class MainActivity extends Activity implements OnClickListener{    public static final String DB_NAME="studentdata.db";    Button insertBtn;    Button updataGBtn;    Button updataABtn;    Button deleteBtn;    Button selectBtn;    Button displayBtn;    Button closeBtn;    ListView mListView;    SQLiteDatabase db;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mListView=new ListView(this);        BtnInit();        OpenCreateDB();    }    public void OpenCreateDB(){    db = openOrCreateDatabase(DB_NAME, this.MODE_PRIVATE, null);        db.execSQL("DROP TABLE IF EXISTS students");          db.execSQL("CREATE TABLE IF NOT EXISTS students (_id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR, age INTEGER,grade INTEGER, info VARCHAR)");    }    //插入数据到students表    public void InsertData(){    Student liSi =new Student("李四", 22, 87, "南京邮电大学 通信工程");        Student liHua = new Student("李华", 23, 78, "南京邮电大学 软件工程");        db.execSQL("INSERT INTO students VALUES (NULL,?,?,?,?)", new Object[]{"张三",21,98,"南京邮电大学 电子信息工程"});        db.execSQL("INSERT INTO students VALUES (NULL,?,?,?,?)", new Object[]{liSi.name,liSi.age,liSi.grade,liSi.info});        db.execSQL("INSERT INTO students VALUES (NULL,'王五',19,99,'南京邮电大学 网络工程')");        ContentValues cvOfLiHua = new ContentValues();        cvOfLiHua.put("name", liHua.name);        cvOfLiHua.put("age", liHua.age);        cvOfLiHua.put("grade", liHua.grade);        cvOfLiHua.put("info", liHua.info);        db.insert("students", null, cvOfLiHua);        Log.d("msg","插入结束");        Toast.makeText(this, "插入数据完成!", Toast.LENGTH_SHORT).show();    }    public void UpdateGrade(){    ContentValues cv = new ContentValues();      cv.put("grade", 85);      //更新数据,将李四的成绩改为85分    db.update("students", cv, "name = ?", new String[]{"李四"});      Log.d("msg","李四的成绩已更新");    Toast.makeText(this, "李四的成绩已更新", Toast.LENGTH_SHORT).show();    }    public void UpdateAge(){    String sqlString="UPDATE students SET age=18 WHERE grade= 78";    db.execSQL(sqlString);    Log.d("msg","李华的年龄已更新");    Toast.makeText(this, "李华的年龄已更新", Toast.LENGTH_SHORT).show();    }    public void Delete(){    db.execSQL("DELETE FROM students WHERE name='张三'");    Log.d("msg","张三的信息已经被删除");    Toast.makeText(this, "张三的信息已经被删除", Toast.LENGTH_SHORT).show();    }    public void Select(){    List<String> list=new ArrayList<String>();    Cursor c = db.rawQuery("SELECT * FROM students WHERE grade >= ?", new String[]{"86"});    Log.d("msg","--------------大于86分的同学----------------------------");    while (c.moveToNext()) {        Student person = new Student();        person._id = c.getInt(c.getColumnIndex("_id"));        person.name = c.getString(c.getColumnIndex("name"));        person.grade=c.getInt(c.getColumnIndex("grade"));        person.age = c.getInt(c.getColumnIndex("age"));        person.info = c.getString(c.getColumnIndex("info"));        String string=""+person._id+" "+person.name+" "+person.grade+" "+person.age+" "+person.info;        list.add(string);        Log.d("msg",string);        }        c.close();        ArrayAdapter<String> adapter=new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1,list);        mListView.setAdapter(adapter);    }    public void Display(){    List<String> list=new ArrayList<String>();    Cursor c = db.rawQuery("SELECT * FROM students", null);        while (c.moveToNext()) {        Student person = new Student();        person._id = c.getInt(c.getColumnIndex("_id"));        person.name = c.getString(c.getColumnIndex("name"));        person.grade=c.getInt(c.getColumnIndex("grade"));        person.age = c.getInt(c.getColumnIndex("age"));        person.info = c.getString(c.getColumnIndex("info"));        String string=""+person._id+" "+person.name+" "+person.grade+" "+person.age+" "+person.info;        list.add(string);        Log.d("msg",string);        }        c.close();        ArrayAdapter<String> adapter=new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1,list);        mListView.setAdapter(adapter);    }    public void Close(){    db.close();    }    public void BtnInit(){    insertBtn=(Button)findViewById(R.id.insert);        updataGBtn=(Button)findViewById(R.id.updataG);        updataABtn=(Button)findViewById(R.id.updataA);        deleteBtn=(Button)findViewById(R.id.delete);        selectBtn=(Button)findViewById(R.id.select);        displayBtn=(Button)findViewById(R.id.display);        closeBtn=(Button)findViewById(R.id.close);        mListView=(ListView)findViewById(R.id.listview);        insertBtn.setOnClickListener(this);        updataABtn.setOnClickListener(this);        updataGBtn.setOnClickListener(this);        deleteBtn.setOnClickListener(this);        selectBtn.setOnClickListener(this);        displayBtn.setOnClickListener(this);        closeBtn.setOnClickListener(this);    }@Overridepublic void onClick(View v) {// TODO Auto-generated method stubswitch(v.getId()){case R.id.insert:InsertData();break;case R.id.updataA:UpdateAge();break;case R.id.updataG:UpdateGrade();break;case R.id.display:Display();break;case R.id.delete:Delete();break;case R.id.select:Select();break;case R.id.close:Close();break;}}}


我们一点点的看吧。

1.布局:这个Activity和一般的Activity没有太大的区别,它有7个按钮控件和一个ListView控件(详细布局见见面的布局文件)。BtnInit()函数是将控件与布局文件相关联,并且设置相应的点击事件处理。每一个点击分别对应一个函数。

2.数据库的建立与打开OpenCreateDB()函数完成。我们声明一个成员变量SQLiteDatabasedb;通过执行系统的API函数openOrCreateDatabase打开或新建一个数据库。通过执行dbexecSQL函数执行创建表的一个SQL语句来创建students表。执行完之后,会在系统的/data/data/[PACKAGE_NAME]/databases目录下出现数据库文件

[1]

此时,相当于有一张students的空表:

students

_id[INTEGER]

name[VARCHAR]

grade[INTEGER]

age[INTEGER]

info[VARCHAR]

3.插入操作:插入操作由函数InsertData()函数完成。我们用了三种方式插入数据。

(a)publicvoid execSQL (Stringsql)

(b)publicvoid execSQL (Stringsql,Object[]bindArgs)

(c)ContentValuesinsert函数相结合的方式

执行完之后,我们可以通过点击‘显示当前数据库’按钮,来查看当前数据库中的信息。

_id[INTEGER]

name[VARCHAR]

grade[INTEGER]

age[INTEGER]

info[VARCHAR]

1

张三

98

21

南京邮电大学电子信息工程

2

李四

87

22

南京邮电大学通信工程

3

王五

99

19

南京邮电大学网络工程

4

李华

78

23

南京邮电大学软件工程

4.更新操作UpdateAge()UpdateGrade()两个函数完成。体现了更新数据两种方式:

(a) publicvoid execSQL (Stringsql)

(b) ContentValuesupdate函数相结合的方式

publicint update(Stringtable,ContentValuesvalues,StringwhereClause,String[]whereArgs)

(c) 当然,我们也可以用publicvoid execSQL (Stringsql,Object[]bindArgs)函数,将参数先用’?’代替,然后再bindArgs中赋值。

5.删除操作:由Delete函数完成。删除操作可以直接用execSQL执行SQL语言。当然,也可以用publicint delete (Stringtable,StringwhereClause,String[]whereArgs)函数,和更新一样,也有三种调用方式,在此不然赘述。

6.查询操作由函数Select()函数完成。查询操作时最复杂的操作。需要rawQuery函数,还有游标Cursor类的使用。首先,我们将我们的查找需求写成SQL语言,然后执行数据库的rawQuery函数,返回的是一个Cursor类型的对象。这个对象指向查询结果集第一行。我们可以通过调用CursormoveToNext函数对查询到的结果集进行遍历。

查询的函数还有:

db.rawQuery(String sql, String[] selectionArgs);

db.query(String table, String[] columns, String selection,String[] selectionArgs, String groupBy, String having, String orderBy);

db.query(String table, String[] columns, String selection,String[] selectionArgs, String groupBy, String having, String orderBy, Stringlimit);

db.query(String distinct, String table, String[] columns, Stringselection, String[] selectionArgs, String groupBy, String having, StringorderBy, String limit);

常用的Cursor的方法如下:

c.move(int offset); //以当前位置为参考,移动到指定行

c.moveToFirst(); //移动到第一行

c.moveToLast(); //移动到最后一行

c.moveToPosition(intposition); //移动到指定行

c.moveToPrevious(); //移动到前一行

c.moveToNext(); //移动到下一行

c.isFirst(); //是否指向第一条

c.isLast(); //是否指向最后一条

c.isBeforeFirst(); //是否指向第一条之前

c.isAfterLast(); //是否指向最后一条之后

c.isNull(intcolumnIndex); //指定列是否为空(列基数为0)

c.isClosed(); //游标是否已关闭

c.getCount(); //总数据项数

c.getPosition(); //返回当前游标所指向的行数

c.getColumnIndex(StringcolumnName);//返回某列名对应的列索引值

c.getString(intcolumnIndex); //返回当前行指定列的值

7.显示操作Display函数完成。我们首先获得表中第一列的Cursor对象,然后逐步遍历即可。我们可以通过如下语句获得:

Cursor c = db.rawQuery("SELECT * FROM students",null);

总结:完成数据库的操作,大多数情况下我们都可以用execSQL函数来执行SQL语言即可。附录中列举了常见的简单SQL语言的操作。

程序运行界面:

[2]

布局文件为:

<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:orientation="vertical"    android:layout_width="fill_parent"    android:layout_height="fill_parent"><Button    android:id="@+id/insert"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="插入"/><Button    android:id="@+id/updataG"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="更新分数"/><Button    android:id="@+id/updataA"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="更新年龄"/>    <Button    android:id="@+id/delete"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="删除"/>   <Button    android:id="@+id/select"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="查找"/><Button    android:id="@+id/display"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="显示当前数据库"/><Button    android:id="@+id/close"android:layout_width="fill_parent"android:layout_height="wrap_content"android:text="关闭"/><ListView     android:id="@+id/listview"    android:layout_width="fill_parent"    android:layout_height="wrap_content"></ListView></LinearLayout>


整个项目的源代码:http://download.csdn.net/detail/nuptboyzhb/4515791

参考:

1.http://blog.csdn.net/liuhe688/article/details/6715983

2. http://www.cnblogs.com/rockdean/articles/2425843.html

附录:

SQLite3支持的数据类型

一般数据采用的固定的静态数据类型,而SQLite采用的是动态数据类型,会根据存入值自动判断。SQLite具有以下五种数据类型:

1.NULL:空值。

2.INTEGER:带符号的整型,具体取决有存入数字的范围大小。

3.REAL:浮点数字,存储为8-byte IEEE浮点数。

4.TEXT:字符串文本。

5.BLOB:二进制对象。

但实际上,sqlite3也接受如下的数据类型:

smallint 16 位元的整数。

interger 32 位元的整数。

decimal(p,s) p 精确值和 s 大小的十进位整数,精确值p是指全部有几个数(digits)大小值,s是指小数点後有几位数。如果没有特别指定,则系统会设为 p=5; s=0

float32位元的实数。

double64位元的实数。

char(n)n 长度的字串,n不能超过 254

varchar(n) 长度不固定且其最大长度为 n的字串,n不能超过 4000

graphic(n) char(n)一样,不过其单位是两个字元 double-bytes n不能超过127。这个形态是为了支援两个字元长度的字体,例如中文字。

vargraphic(n)可变长度且其最大长度为 n的双字元字串,n不能超过 2000

date 包含了年份、月份、日期。

time 包含了小时、分钟、秒。

timestamp 包含了年、月、日、时、分、秒、千分之一秒。

datetime 包含日期时间格式,必须写成'2010-08-05'不能写为'2010-8-5',否则在读取时会产生错误!

sql语言的基本语句

()表的建立

关系数据库的主要特点之一就是用表的方式组织数据。表是SQL语言存放数据、查找数据以及更新数据的基本数据结构。在SQL语言中,表有严格的定义,它是一种二维表,对于这种表有如下规定:

1)每一张表都有一个名字,通常称为表名或关系名。表名必须以字母开头,最大长度为30个字符。
2)一张表可以由若干列组成,列名唯一,列名也称作属性名。
3)表中的一行称为一个元组,它相当于一条记录。
4)同一列的数据必须具有相同的数据类型。
5)表中的每一个列值必须是不可分割的基本数据项。

注意:当用户需要新的数据结构或表存放数据时,首先要生成一个表。

语法:

CREATE TABLE 表名 [表约束]

(列名1数据类型 [缺省值1,列约束1]

(列名2数据类型 [缺省值2,列约束2]

列名n 数据类型 [缺省值n,列约束n]

[TABLESPACE 表空间名称]

[STORAGE (存贮的子句)]

[ENABLE 约束名]

[DISABLE 约束名]

()插入数据

当一个表新建成时,它里面没有数据,通过向表中扦入数据,建成表的实例。

语句句法:

INSERT INTO 表名[(列名1,…)]

VALUES(1,值2…,n)

[子查询]

假设有一张表Student如下所示:

NO

NAME

AGE

1001

A

12

1002

B

14

将新学生E增加到上表中,并按照表的结构将信息添加完整,需要如下语句:

INSERT INTO STUDENT VALUSE(1003, 'E',12);

()修改数据

对表中已有数据进行修改,语句句法:

UPDATE 表名SET列名1=表达式1,列名2=表达式2

WHERE 条件;

例如:对下表Student

NO

NAME

AGE

1001

A

12

1002

B

14

B的年纪改为18;应该执行以下语句:

UPDATE STUDENT SET AGE=18 WHERE NAME='B';

()删除数据

删除表中已有数据,不能删除不存在的数据。

语句句法:

DELETE FROM 表名 WHERE 条件;

例如:

对下面Student表进行删除,要删除其中年纪为12的学生;

NO

NAME

AGE

1001

A

12

1002

B

14

DELETE FROM STUDENT WHERE AGE12

()表结构的修改

在已存在的表中增加新列,语句句法:

ALTER TABLE 表名 ADD(新列名数据类型(长度))

例如:

ALTER TABLE STUDENT ADD (DEPARTMENT CHAR(8));

b.增加已有列的数据类型。

例如:

ALTER TABLE STUDENT MODIFY(NAME VARCHAR2(25));

()表的删除

将已经存在的表删除,语句句法:

DROP TABLE表名;

例如:

DROP TABLE EMP

()查询语句 (复杂)

SELECT命令的语法为:

SELECT [DISTINCT|ALL] {*|模式名.] {表名|视图名|

快照名] .*…| {表达式[列别名]…} } [, [模式名. ] {表名|

视图名|} .*…| 表达式[列别名] ]…

FROM [模式名.] {表名|视图名|快照名} [@数据库链名] [表别名]

[, [模式名.] {表名|视图名|快照名} [@数据库链名]

[表别名] ]…

[WHERE条件]

[START WITH条件 CONNECT BY条件]

[GROUP BY表达式[,表达式] …[HAVING条件]

[UNION|UNION ALL |INTERSECT|MINUS]SELECT命令

[ORDER BY{表达式|位置} [ASC|DESC] [, {表达式|位置[ASC|DESC]}]…]

例如:对于STUDENT:

NO

NAME

AGE

1001

AE

12

1002

BT

14

(1) 查询年纪为12的学生姓名;

SELECT STUDENT.NAME FROM STUDENT WHERE AGE=12;

(2) 查询年纪在1216岁之间的学生姓名;

SELECT STUDENT.NAME FROM STUDENT WHERE AGE BETWEEN 12 AND16;

(3) 查询年纪1216岁之间的学生姓名;

SELECT STUDENT.NAME FROM STUDENT WHERE AGE NOT BETWEEN 12AND 16;

(4) 查询所有姓名以A开头的学生的姓名;

SELECT STUDENT.NAME FROM STUDENT WHERE NAME LIKE 'A%';

(5) 列出所有学生年纪的和,年纪的平均值,最大值,最小值,最大值与最小值之间的差值;

SELECT AVG(AGE), SUM(AGE), MAX(AGE), MIN(AGE),MAX(AGE)-MIN(AGE);

(6) 将所有学生按学号顺序升序排列;

SELECT * FROM STUDENT ORDER BY NO DESC;

(7) 将所有学生按学号顺序升序排列;

SELECT * FROM STUDENT ORDER BY NO ASC;

更多相关文章

  1. SpringBoot 2.0 中 HikariCP 数据库连接池原理解析
  2. 一句话锁定MySQL数据占用元凶
  3. Android(安卓)Parcelable理解与使用(对象序列化)
  4. listview与adapter用法
  5. android AutoCompleteTextView+ SQLite
  6. 请求网络数据后更新视图
  7. Android(安卓)recovery 原理分析
  8. [Android] Opengl ES 机型适配 bug 汇总
  9. Android使用ListView构造复杂页面,并响应点击事件,通过intent跳转

随机推荐

  1. Android高德地图自定义放大缩小控件
  2. 在android中使用OrmLite数据库框架
  3. Android map
  4. Mac 配置Android环境变量( 有图)
  5. Android 编辑框(EditText)属性
  6. 新浪微博Android客户端SSO授权认证缺陷
  7. android中adb命令大全
  8. Android 性能优化的一些方法
  9. 【android乱七八糟】android体系结构
  10. OpenJDK将对Android开发产生怎样的影响?