Android SQLite

一、什么是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

image

二、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、运行程序,查看结果:

image

 image

image

image

本例使用的是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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值