一、什么是SQLite
SQLite是一款开源的、轻量级的、嵌入式的、关系型数据库。它在2000年由D. Richard Hipp发布,可以支援Java、Net、PHP、Ruby、Python、Perl、C等几乎所有的现代编程语言,支持Windows、Linux、Unix、Mac OS、Android、IOS等几乎所有的主流操作系统平台。
SQLite被广泛应用的在苹果、Adobe、Google的各项产品。如果非要举一个你身边应用SQLite的例子的话,如果你的机器中装的有迅雷,请打开迅雷安装目录,搜索一下sqlite3.dll,是不是找到了它的身影? 如果你装的有金山词霸,那么打开他的安装目录也会看到sqlite.dll的存在。是的,SQLite早就广泛的应用在我们接触的各种产品中了,当然我们今天学习它,是因为在Android开发中,Android推荐的数据库,也是内置了完整支持的数据库就是SQlite。
SQLite的特性:
1. ACID事务
2. 零配置 – 无需安装和管理配置
3. 储存在单一磁盘文件中的一个完整的数据库
4. 数据库文件可以在不同字节顺序的机器间自由的共享
5. 支持数据库大小至2TB
6. 足够小, 大致3万行C代码, 250K
7. 比一些流行的数据库在大部分普通数据库操作要快
8. 简单, 轻松的API
9. 包含TCL绑定, 同时通过Wrapper支持其他语言的绑定
10. 良好注释的源代码, 并且有着90%以上的测试覆盖率
11. 独立: 没有额外依赖
12. Source完全的Open, 你可以用于任何用途, 包括出售它
13. 支持多种开发语言,C, PHP, Perl, Java, ASP.NET,Python
推荐的SQLite客户端管理工具,火狐插件 Sqlite Manger
二、Android中使用SQLite
我们还是通过一个例子来学习,相关讲解都写在代码注释里。
1、新建一个项目Lesson15_HelloSqlite,Activity起名叫MainHelloSqlite.java
2、编写用户界面 res/layout/main.xml,准备增(insert)删(delete)改(update)查(select)四个按钮,准备一个下拉列表spinner,显示表中的数据。
01
<?xml version="1.0" encoding="utf-8"?>
02
<linearlayout android:layout_height="fill_parent" android:layout_width="fill_parent" android:orientation="vertical" xmlns:android="http://schemas.android.com/apk/res/android">
03
04
<textview android:layout_height="wrap_content" android:layout_width="wrap_content" android:textsize="20sp" android:layout_margintop="5dp" android:id="@+id/TextView01" android:text="SQLite基本操作">
05
</textview>
06
07
<button android:layout_height="wrap_content" android:layout_width="wrap_content" android:textsize="20sp" android:layout_margintop="5dp" android:id="@+id/Button01" android:text="增 | insert" android:minwidth="200dp"></button>
08
09
<button android:layout_height="wrap_content" android:layout_width="wrap_content" android:textsize="20sp" android:layout_margintop="5dp" android:id="@+id/Button02" android:text="删 | delete" android:minwidth="200dp"></button>
10
11
<button android:layout_height="wrap_content" android:layout_width="wrap_content" android:textsize="20sp" android:layout_margintop="5dp" android:id="@+id/Button03" android:text="改 | update" android:minwidth="200dp"></button>
12
13
<button android:layout_height="wrap_content" android:layout_width="wrap_content" android:textsize="20sp" android:layout_margintop="5dp" android:id="@+id/Button04" android:text="查 | select" android:minwidth="200dp"></button>
14
15
<spinner android:layout_height="wrap_content" android:layout_width="wrap_content" android:layout_margintop="5dp" android:id="@+id/Spinner01" android:minwidth="200dp">
16
</spinner>
17
18
<textview android:layout_height="wrap_content" android:layout_width="wrap_content" android:textsize="20sp" android:layout_margintop="5dp" android:id="@+id/TextView02"></textview>
19
</linearlayout>
3、在MainHeloSqlite.java的同目录中新建一个数据库操作辅助类 DbHelper.java,内容如下:
01
package android.basic.lesson15;
02
03
import android.content.Context;
04
import android.database.sqlite.SQLiteDatabase;
05
import android.database.sqlite.SQLiteDatabase.CursorFactory;
06
import android.database.sqlite.SQLiteOpenHelper;
07
08
public class DbHelper extends SQLiteOpenHelper {
09
10
public DbHelper(Context context, String name, CursorFactory factory,
11
int version) {
12
super(context, name, factory, version);
13
}
14
15
//辅助类建立时运行该方法
16
@Override
17
public void onCreate(SQLiteDatabase db) {
18
19
String sql = "CREATE TABLE pic (_id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL , fileName VARCHAR, description VARCHAR)";
20
db.execSQL(sql);
21
}
22
23
@Override
24
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
25
}
26
27
}
4、MainHelloSqlite.java的内容如下:
001
package android.basic.lesson15;
002
003
import android.app.Activity;
004
import android.content.ContentValues;
005
import android.database.Cursor;
006
import android.database.sqlite.SQLiteDatabase;
007
import android.os.Bundle;
008
import android.view.View;
009
import android.view.View.OnClickListener;
010
import android.widget.AdapterView;
011
import android.widget.AdapterView.OnItemSelectedListener;
012
import android.widget.Button;
013
import android.widget.SimpleCursorAdapter;
014
import android.widget.Spinner;
015
import android.widget.TextView;
016
import android.widget.Toast;
017
018
public class MainHelloSqlite extends Activity {
019
020
//SQLiteDatabase对象
021
SQLiteDatabase db;
022
//数据库名
023
public String db_name = "gallery.sqlite";
024
//表名
025
public String table_name = "pic";
026
027
//辅助类名
028
final DbHelper helper = new DbHelper(this, db_name, null, 1);
029
030
/** Called when the activity is first created. */
031
@Override
032
public void onCreate(Bundle savedInstanceState) {
033
super.onCreate(savedInstanceState);
034
setContentView(R.layout.main);
035
036
//UI组件
037
Button b1 = (Button) findViewById(R.id.Button01);
038
Button b2 = (Button) findViewById(R.id.Button02);
039
Button b3 = (Button) findViewById(R.id.Button03);
040
Button b4 = (Button) findViewById(R.id.Button04);
041
042
//从辅助类获得数据库对象
043
db = helper.getWritableDatabase();
044
045
//初始化数据
046
initDatabase(db);
047
//更新下拉列表中的数据
048
updateSpinner();
049
050
//定义按钮点击监听器
051
OnClickListener ocl = new OnClickListener() {
052
053
@Override
054
public void onClick(View v) {
055
056
//ContentValues对象
057
ContentValues cv = new ContentValues();
058
switch (v.getId()) {
059
060
//添加按钮
061
case R.id.Button01:
062
063
cv.put("fileName", "pic5.jpg");
064
cv.put("description", "图片5");
065
//添加方法
066
long long1 = db.insert("pic", "", cv);
067
//添加成功后返回行号,失败后返回-1
068
if (long1 == -1) {
069
Toast.makeText(MainHelloSqlite.this,
070
"ID是" + long1 + "的图片添加失败!", Toast.LENGTH_SHORT)
071
.show();
072
} else {
073
Toast.makeText(MainHelloSqlite.this,
074
"ID是" + long1 + "的图片添加成功!", Toast.LENGTH_SHORT)
075
.show();
076
}
077
//更新下拉列表
078
updateSpinner();
079
break;
080
081
//删除描述是'图片5'的数据行
082
case R.id.Button02:
083
//删除方法
084
long long2 = db.delete("pic", "description='图片5'", null);
085
//删除失败返回0,成功则返回删除的条数
086
Toast.makeText(MainHelloSqlite.this, "删除了" + long2 + "条记录",
087
Toast.LENGTH_SHORT).show();
088
//更新下拉列表
089
updateSpinner();
090
break;
091
092
//更新文件名是'pic5.jpg'的数据行
093
case R.id.Button03:
094
095
cv.put("fileName", "pic0.jpg");
096
cv.put("description", "图片0");
097
//更新方法
098
int long3 = db.update("pic", cv, "fileName='pic5.jpg'", null);
099
//删除失败返回0,成功则返回删除的条数
100
Toast.makeText(MainHelloSqlite.this, "更新了" + long3 + "条记录",
101
Toast.LENGTH_SHORT).show();
102
//更新下拉列表
103
updateSpinner();
104
break;
105
106
//查询当前所有数据
107
case R.id.Button04:
108
Cursor c = db.query("pic", null, null, null, null,
109
null, null);
110
//cursor.getCount()是记录条数
111
Toast.makeText(MainHelloSqlite.this,
112
"当前共有" + c.getCount() + "条记录,下面一一显示:",
113
Toast.LENGTH_SHORT).show();
114
//循环显示
115
for(c.moveToFirst();!c.isAfterLast();c.moveToNext()){
116
Toast.makeText(MainHelloSqlite.this,
117
"第"+ c.getInt(0) +"条数据,文件名是" + c.getString(1) + ",描述是"+c.getString(2),
118
Toast.LENGTH_SHORT).show();
119
}
120
//更新下拉列表
121
updateSpinner();
122
break;
123
}
124
}
125
};
126
127
//给按钮绑定监听器
128
b1.setOnClickListener(ocl);
129
b2.setOnClickListener(ocl);
130
b3.setOnClickListener(ocl);
131
b4.setOnClickListener(ocl);
132
133
}
134
135
//初始化表
136
public void initDatabase(SQLiteDatabase db) {
137
ContentValues cv = new ContentValues();
138
139
cv.put("fileName", "pic1.jpg");
140
cv.put("description", "图片1");
141
db.insert(table_name, "", cv);
142
143
cv.put("fileName", "pic2.jpg");
144
cv.put("description", "图片2");
145
db.insert(table_name, "", cv);
146
147
cv.put("fileName", "pic3.jpg");
148
cv.put("description", "图片3");
149
db.insert(table_name, "", cv);
150
151
cv.put("fileName", "pic4.jpg");
152
cv.put("description", "图片4");
153
db.insert(table_name, "", cv);
154
155
}
156
157
//更新下拉列表
158
public void updateSpinner() {
159
160
//定义UI组件
161
final TextView tv = (TextView) findViewById(R.id.TextView02);
162
Spinner s = (Spinner) findViewById(R.id.Spinner01);
163
164
//从数据库中获取数据放入游标Cursor对象
165
final Cursor cursor = db.query("pic", null, null, null, null, null,
166
null);
167
168
//创建简单游标匹配器
169
SimpleCursorAdapter adapter = new SimpleCursorAdapter(this,
170
android.R.layout.simple_spinner_item, cursor, new String[] {
171
"fileName", "description" }, new int[] {
172
android.R.id.text1, android.R.id.text2 });
173
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
174
175
//给下拉列表设置匹配器
176
s.setAdapter(adapter);
177
178
//定义子元素选择监听器
179
OnItemSelectedListener oisl = new OnItemSelectedListener() {
180
181
@Override
182
public void onItemSelected(AdapterView<?> parent, View view,
183
int position, long id) {
184
cursor.moveToPosition(position);
185
tv.setText("当前pic的描述为:" + cursor.getString(2));
186
}
187
188
@Override
189
public void onNothingSelected(AdapterView<?> parent) {
190
}
191
};
192
193
//给下拉列表绑定子元素选择监听器
194
s.setOnItemSelectedListener(oisl);
195
}
196
197
//窗口销毁时删除表中数据
198
@Override
199
public void onDestroy() {
200
super.onDestroy();
201
db.delete(table_name, null, null);
202
updateSpinner();
203
}
204
}
5、运行程序,查看结果:
本例使用的是SQLiteDatabase已经封装好的insert,delete,update,query方法,感兴趣的同学可以用SQLiteDatabase的execSQL()方法和rawQuery()方法来实现。
转载http://android.yaohuiji.com/archives/582
SQLite所支持的数据类型:
SQLite,SQLite3支持 NULL、INTEGER、REAL(浮点数字)、TEXT(字符串文本)和BLOB(二进制对象)数据类型,虽然它支持的类型只有五种,但实际上sqlite3也接受varchar(n)、char(n)、decimal(p,s) 等数据类型,只不过在运算或保存时会转成对应的五种数据类型。
SQLite最大的特点是你可以把各种类型的数据保存到任何字段中,而不用关心字段声明的数据类型是什么。例如:可以在Integer类型的字段中存放字符串,或者在布尔型字段中存放浮点数,或者在字符型字段中存放日期型值。 但有一种情况例外:定义为INTEGER PRIMARY KEY的字段只能存储64位整数, 当向这种字段保存除整数以外的数据时,将会产生错误。 另外, SQLite 在解析CREATE TABLE 语句时,会忽略 CREATE TABLE 语句中跟在字段名后面的数据类型信息,如下面语句会忽略 name字段的类型信息:
CREATE TABLE person (personid integer primary key autoincrement, name varchar(20))
SQLite语句示范:
查询语句:select * from 表名 where 条件子句 group by 分组字句 having ... order by 排序子句
如:select * from person
select * from person order by id desc
select name from person group by name having count(*)>1
分页SQL与mysql类似,下面SQL语句获取5条记录,跳过前面3条记录
select * from Account limit 5 offset 3 或者 select * from Account limit 3,5
插入语句:insert into 表名(字段列表) values(值列表)。如: insert into person(name, age) values(‘张三’,3)
更新语句:update 表名 set 字段名=值 where 条件子句。如:update person set name=‘张三‘ where id=10
删除语句:delete from 表名 where 条件子句。如:delete from person where id=10
使用SQLiteOpenHelper对数据库进行版本管理
SQLiteOpenHelper
它是一个抽象类,用于对数据库版本进行控制。为了达到对数据库的一种管理我们必须继承自SQLiteOpenHelper这个抽象类。它是通过对数据库版本进行管理来实现一些需求。 为了实现对数据库版本进行管理,SQLiteOpenHelper类提供了两个重要的方法,分别是onCreate(SQLiteDatabase db)和onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion),
下面将列出一些SQLiteOpenHelper类的一些常见方法:
两个构造方法:
方法名称 | 描述 |
public SQLiteOpenHelper (Context context, String name, SQLiteDatabase.CursorFactory factory, int version) |
|
public SQLiteOpenHelper (Context context, String name, SQLiteDatabase.CursorFactory factory, int version, DatabaseErrorHandler errorHandler) |
|
方法名称 | 描述 |
public void onOpen (SQLiteDatabase db) | 打开数据库 |
public abstract void onCreate (SQLiteDatabase db) | 初次使用软件时生成数据库表。在这个方法里面可以生成数据库表结构及添加一些应用使用到的初始化数据 |
public abstract void onUpgrade (SQLiteDatabase db, int oldVersion, int newVersion) | 用于升级软件时更新数据库表结构。在数据库的版本发生变化时会被调用,一般在软件升级时才需改变版本号
|
public synchronized SQLiteDatabase getWritableDatabase () | 得到一个可写的SQLiteDatabase实例 |
public synchronized SQLiteDatabase getReadableDatabase () | 得到一个可读的SQLiteDatabase实例 |
getWritableDatabase()和getReadableDatabase()的区别:
getWritableDatabase()和getReadableDatabase()方法都可以获取一个用于操作数据库的SQLiteDatabase实例。但getWritableDatabase() 方法以读写方式打开数据库,一旦数据库的磁盘空间满了,数据库就只能读而不能写,倘若使用getWritableDatabase()打开数据库就会出错。getReadableDatabase()方法先以读写方式打开数据库,如果数据库的磁盘空间满了,就会打开失败,当打开失败后会继续尝试以只读方式打开数据库。
SQLiteDatabase
SQLiteDatabase代表的是一个数据库(底层就是一个数据库文件),一量应用程序获得了代表指定的数据库的SQLiteDatabase对象,接下来我们就可以用它来完成管理、操作数据库了。
几个静态方法获得SQLiteDatabase对象
方法名称 | 描述 |
public static SQLiteDatabase openDatabase (String path, SQLiteDatabase.CursorFactory factory, int flags, DatabaseErrorHandler errorHandler) | 打开path下的所代表的SQLite数据库 |
public static SQLiteDatabase openDatabase (String path, SQLiteDatabase.CursorFactory factory, int flags) | 打开path下的所代表的SQLite数据库 |
public static SQLiteDatabase openOrCreateDatabase (String path, SQLiteDatabase.CursorFactory factory, DatabaseErrorHandler errorHandler) | 打开path下的所代表的SQLite数据库 |
public static SQLiteDatabase openOrCreateDatabase (String path, SQLiteDatabase.CursorFactory factory) | 打开或者创建path下的所代表的SQLite数据库 |
public static SQLiteDatabase openOrCreateDatabase (File file, SQLiteDatabase.CursorFactory factory) | 打开或者创建file下的所代表的SQLite数据库 |
常用方法
方法名称 | 描述 |
public void execSQL (String sql) | 执行SQL语句 |
public void execSQL (String sql, Object[] bindArgs) | 执行带占位符的SQL语句 |
public long insert (String table, String nullColumnHack, ContentValues values) | 向table表中插入数据 |
public int update (String table, ContentValues values, String whereClause, String[] whereArgs) | 更新指定表table中的特定数据 |
public int delete (String table, String whereClause, String[] whereArgs) | 删除指定表(table)中的特定数据 |
public Cursor query (String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit) | 对执行数据表进行查询 |
public Cursor query (String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy) | 对执行数据表进行查询。参数说明: table: columns: selection: selectionArgs: groupBy: having: orderBy: |
public Cursor query (boolean distinct, String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy, String limit) | 对执行数据表进行查询 |
public Cursor rawQuery (String sql, String[] selectionArgs) | 执行带占位符的SQL查询。参数说明: sql: selectionArgs: |
public void beginTransaction () | 开始事务 |
public void endTransaction () | 结束事务 |
Cursor类
它是一个接口。Cursor的中文意思可以理解为一个游标,也类似于结果集,比如我们在JDBC中的ResultSet。它有以下的常用方法
方法名称 | 描述 |
public abstract void move(int offset) | 将记录指针向上或向下移动指定的行数。Offset为正向下移动,为负身上移动 |
public abstract boolean moveToFirst() | 将记录指定移动到第一行,如果移动成功返回true |
public abstract boolean moveToLast() | 将记录指针移动到最后一行。如果成功返回true |
public abstract boolean moveToNext() | 将记录指定移动到下一行,如果成功返回true |
public abstract boolean moveToPosition(int position) | 将记录指定移动到指定的行,如果移动成功则返回true |
public abstract boolean moveToPrevious(0 | 将记录指针将到上一行,如果移动成功则返回true |
转载 http://blog.csdn.net/jiahui524/article/details/7003180