Android SQLite总结(一)

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

前言

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

[java] view plaincopy
  1. packagecom.example.njupt.zhb.sqlite1;
  2. importjava.lang.String;
  3. publicclassStudent{
  4. int_id;//与所建立的表对应
  5. Stringname;
  6. intage;
  7. intgrade;
  8. Stringinfo;
  9. publicStudent(Stringname,intage,intgrade,Stringinfo){
  10. this.name=name;
  11. this.age=age;
  12. this.grade=grade;
  13. this.info=info;
  14. }
  15. publicStudent(){
  16. }
  17. }

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

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

[java] view plaincopy
  1. packagecom.example.njupt.zhb.sqlite1;
  2. importjava.util.ArrayList;
  3. importjava.util.List;
  4. importandroid.os.Bundle;
  5. importandroid.util.Log;
  6. importandroid.widget.ArrayAdapter;
  7. importandroid.widget.Button;
  8. importandroid.widget.ListView;
  9. importandroid.widget.Toast;
  10. importandroid.app.Activity;
  11. importandroid.content.ContentValues;
  12. importandroid.database.Cursor;
  13. importandroid.database.sqlite.SQLiteDatabase;
  14. importandroid.view.View;
  15. importandroid.view.View.OnClickListener;
  16. publicclassMainActivityextendsActivityimplementsOnClickListener{
  17. publicstaticfinalStringDB_NAME="studentdata.db";
  18. ButtoninsertBtn;
  19. ButtonupdataGBtn;
  20. ButtonupdataABtn;
  21. ButtondeleteBtn;
  22. ButtonselectBtn;
  23. ButtondisplayBtn;
  24. ButtoncloseBtn;
  25. ListViewmListView;
  26. SQLiteDatabasedb;
  27. @Override
  28. publicvoidonCreate(BundlesavedInstanceState){
  29. super.onCreate(savedInstanceState);
  30. setContentView(R.layout.activity_main);
  31. mListView=newListView(this);
  32. BtnInit();
  33. OpenCreateDB();
  34. }
  35. publicvoidOpenCreateDB(){
  36. db=openOrCreateDatabase(DB_NAME,this.MODE_PRIVATE,null);
  37. db.execSQL("DROPTABLEIFEXISTSstudents");
  38. db.execSQL("CREATETABLEIFNOTEXISTSstudents(_idINTEGERPRIMARYKEYAUTOINCREMENT,nameVARCHAR,ageINTEGER,gradeINTEGER,infoVARCHAR)");
  39. }
  40. //插入数据到students表
  41. publicvoidInsertData(){
  42. StudentliSi=newStudent("李四",22,87,"南京邮电大学通信工程");
  43. StudentliHua=newStudent("李华",23,78,"南京邮电大学软件工程");
  44. db.execSQL("INSERTINTOstudentsVALUES(NULL,?,?,?,?)",newObject[]{"张三",21,98,"南京邮电大学电子信息工程"});
  45. db.execSQL("INSERTINTOstudentsVALUES(NULL,?,?,?,?)",newObject[]{liSi.name,liSi.age,liSi.grade,liSi.info});
  46. db.execSQL("INSERTINTOstudentsVALUES(NULL,'王五',19,99,'南京邮电大学网络工程')");
  47. ContentValuescvOfLiHua=newContentValues();
  48. cvOfLiHua.put("name",liHua.name);
  49. cvOfLiHua.put("age",liHua.age);
  50. cvOfLiHua.put("grade",liHua.grade);
  51. cvOfLiHua.put("info",liHua.info);
  52. db.insert("students",null,cvOfLiHua);
  53. Log.d("msg","插入结束");
  54. Toast.makeText(this,"插入数据完成!",Toast.LENGTH_SHORT).show();
  55. }
  56. publicvoidUpdateGrade(){
  57. ContentValuescv=newContentValues();
  58. cv.put("grade",85);
  59. //更新数据,将李四的成绩改为85分
  60. db.update("students",cv,"name=?",newString[]{"李四"});
  61. Log.d("msg","李四的成绩已更新");
  62. Toast.makeText(this,"李四的成绩已更新",Toast.LENGTH_SHORT).show();
  63. }
  64. publicvoidUpdateAge(){
  65. StringsqlString="UPDATEstudentsSETage=18WHEREgrade=78";
  66. db.execSQL(sqlString);
  67. Log.d("msg","李华的年龄已更新");
  68. Toast.makeText(this,"李华的年龄已更新",Toast.LENGTH_SHORT).show();
  69. }
  70. publicvoidDelete(){
  71. db.execSQL("DELETEFROMstudentsWHEREname='张三'");
  72. Log.d("msg","张三的信息已经被删除");
  73. Toast.makeText(this,"张三的信息已经被删除",Toast.LENGTH_SHORT).show();
  74. }
  75. publicvoidSelect(){
  76. List<String>list=newArrayList<String>();
  77. Cursorc=db.rawQuery("SELECT*FROMstudentsWHEREgrade>=?",newString[]{"86"});
  78. Log.d("msg","--------------大于86分的同学----------------------------");
  79. while(c.moveToNext()){
  80. Studentperson=newStudent();
  81. person._id=c.getInt(c.getColumnIndex("_id"));
  82. person.name=c.getString(c.getColumnIndex("name"));
  83. person.grade=c.getInt(c.getColumnIndex("grade"));
  84. person.age=c.getInt(c.getColumnIndex("age"));
  85. person.info=c.getString(c.getColumnIndex("info"));
  86. Stringstring=""+person._id+""+person.name+""+person.grade+""+person.age+""+person.info;
  87. list.add(string);
  88. Log.d("msg",string);
  89. }
  90. c.close();
  91. ArrayAdapter<String>adapter=newArrayAdapter<String>(this,android.R.layout.simple_expandable_list_item_1,list);
  92. mListView.setAdapter(adapter);
  93. }
  94. publicvoidDisplay(){
  95. List<String>list=newArrayList<String>();
  96. Cursorc=db.rawQuery("SELECT*FROMstudents",null);
  97. while(c.moveToNext()){
  98. Studentperson=newStudent();
  99. person._id=c.getInt(c.getColumnIndex("_id"));
  100. person.name=c.getString(c.getColumnIndex("name"));
  101. person.grade=c.getInt(c.getColumnIndex("grade"));
  102. person.age=c.getInt(c.getColumnIndex("age"));
  103. person.info=c.getString(c.getColumnIndex("info"));
  104. Stringstring=""+person._id+""+person.name+""+person.grade+""+person.age+""+person.info;
  105. list.add(string);
  106. Log.d("msg",string);
  107. }
  108. c.close();
  109. ArrayAdapter<String>adapter=newArrayAdapter<String>(this,android.R.layout.simple_expandable_list_item_1,list);
  110. mListView.setAdapter(adapter);
  111. }
  112. publicvoidClose(){
  113. db.close();
  114. }
  115. publicvoidBtnInit(){
  116. insertBtn=(Button)findViewById(R.id.insert);
  117. updataGBtn=(Button)findViewById(R.id.updataG);
  118. updataABtn=(Button)findViewById(R.id.updataA);
  119. deleteBtn=(Button)findViewById(R.id.delete);
  120. selectBtn=(Button)findViewById(R.id.select);
  121. displayBtn=(Button)findViewById(R.id.display);
  122. closeBtn=(Button)findViewById(R.id.close);
  123. mListView=(ListView)findViewById(R.id.listview);
  124. insertBtn.setOnClickListener(this);
  125. updataABtn.setOnClickListener(this);
  126. updataGBtn.setOnClickListener(this);
  127. deleteBtn.setOnClickListener(this);
  128. selectBtn.setOnClickListener(this);
  129. displayBtn.setOnClickListener(this);
  130. closeBtn.setOnClickListener(this);
  131. }
  132. @Override
  133. publicvoidonClick(Viewv){
  134. //TODOAuto-generatedmethodstub
  135. switch(v.getId()){
  136. caseR.id.insert:
  137. InsertData();
  138. break;
  139. caseR.id.updataA:
  140. UpdateAge();
  141. break;
  142. caseR.id.updataG:
  143. UpdateGrade();
  144. break;
  145. caseR.id.display:
  146. Display();
  147. break;
  148. caseR.id.delete:
  149. Delete();
  150. break;
  151. caseR.id.select:
  152. Select();
  153. break;
  154. caseR.id.close:
  155. Close();
  156. break;
  157. }
  158. }
  159. }

我们一点点的看吧。

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

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

[图1]

Android SQLite总结(一)

此时,相当于有一张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)ContentValues与insert函数相结合的方式

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

_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)ContentValues与update函数相结合的方式

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类型的对象。这个对象指向查询结果集第一行。我们可以通过调用Cursor的moveToNext函数对查询到的结果集进行遍历。

查询的函数还有:

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]

Android SQLite总结(一)

布局文件为:

[html] view plaincopy
  1. <?xmlversion="1.0"encoding="utf-8"?>
  2. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent">
  6. <Button
  7. android:id="@+id/insert"
  8. android:layout_width="fill_parent"
  9. android:layout_height="wrap_content"
  10. android:text="插入"/>
  11. <Button
  12. android:id="@+id/updataG"
  13. android:layout_width="fill_parent"
  14. android:layout_height="wrap_content"
  15. android:text="更新分数"/>
  16. <Button
  17. android:id="@+id/updataA"
  18. android:layout_width="fill_parent"
  19. android:layout_height="wrap_content"
  20. android:text="更新年龄"/>
  21. <Button
  22. android:id="@+id/delete"
  23. android:layout_width="fill_parent"
  24. android:layout_height="wrap_content"
  25. android:text="删除"/>
  26. <Button
  27. android:id="@+id/select"
  28. android:layout_width="fill_parent"
  29. android:layout_height="wrap_content"
  30. android:text="查找"/>
  31. <Button
  32. android:id="@+id/display"
  33. android:layout_width="fill_parent"
  34. android:layout_height="wrap_content"
  35. android:text="显示当前数据库"/>
  36. <Button
  37. android:id="@+id/close"
  38. android:layout_width="fill_parent"
  39. android:layout_height="wrap_content"
  40. android:text="关闭"/>
  41. <ListView
  42. android:id="@+id/listview"
  43. android:layout_width="fill_parent"
  44. android:layout_height="wrap_content"></ListView>
  45. </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 AGE=12;

()表结构的修改

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

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)查询年纪在12至16岁之间的学生姓名;

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

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

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. 通过Android 客户端上传数据到服务器
  2. 通过adb工具查看android sqlite3数据库
  3. Android实习生 —— 网络请求及数据解析
  4. Android P的Socket通信实现之传输图片数据
  5. Android Studio如何使用快捷键生成get,set,tostring,构造函数
  6. Android数据存储的方法
  7. 第九章使用ContentProvider实现数据共享

随机推荐

  1. Android(安卓)获取签名证书的详细信息(Ecl
  2. android SharedPreferences 使用
  3. Android之Sqlite模糊查询
  4. Android - Android Studio 自动(auto)添
  5. Android studio升级AndroidX
  6. About Android; Geocoder, “the service
  7. 基于TCP/IP协议的Java服务端与Android客
  8. Android使用系统方法实现分享到QQ和微信!
  9. JAVAer的路
  10. android EditText控件如何禁止输入内容