文档章节

SQLite

 梦想家Peng
发布于 2016/03/02 11:43
字数 1507
阅读 9
收藏 0

数据库:存储数据的仓库,每一个数据库都可以存在多张数据表

数据表:具体存储数据的表,类似excel表格

常见的数据库有:MS SQL Server、MY SQL、Oracle……

SQLite并不是数据库服务器软件,在开发中,它表现为某1个文件。

查看SQLite数据文件的软件:SQLiteSpy、SQLiteExpert



【初始化过程】

1. 创建数据库

2. 创建数据表

【访问数据流程】

1. 连接到(打开)数据库

2. 访问数据表

创建数据库

方法1:openOrCreateDatabase()


创建数据表

CREATE TABLE '表名' (设计字段列表);

字段列表的格式为:字段(列)名、数据类型、约束

创建数据表示例:

String sql = "CREATE TABLE 'student' (" +

"_id integer primary key autoincrement, " +

"stu_name varchar(16) not null, " +

"stu_phone_number varchar(16) not null unique" +

")";

注意:SQLite是非常轻量级的数据库,所以,SQLite对存储的数据类型要求是不严格的,但是,仍然推荐规范的使用SQLite数据库。

String name = "tedu.db";
int mode = MODE_PRIVATE;
CursorFactory factory = null;
SQLiteDatabase db;
db = openOrCreateDatabase(name, mode, factory);
 
// 创建数据表
String sql = "CREATE TABLE 'student' (" +
        "_id integer primary key autoincrement, " +
        "stu_name varchar(16) not null, " +
        "stu_phone_number varchar(16) not null unique" +
        ")";
db.execSQL(sql);


数据操作:增删改查

增:insert into '表名' (字段列表) values (值列表)

删:delete from '表名' where子句

改:update '表名' set 字段=值的赋值列表 where子句

查:select 字段列表 from '表名' where子句 排序 分页


使用SQLiteDatabase实现数据管理

insert()

  第1个参数:表名

  第2个参数:无视,当确保第3个参数为有效值时,第2个参数没有任何意义

  第3个参数:确定要增加的数据,第3个参数ContentValues对象必须至少调用过1次put方法,即可使得该参数是有效的

  返回值:新记录的ID,如果增加失败,则返回-1

// 无视,当确保第3个参数为有效值时,第2个参数没有任何意义
String nullColumnHack = null;
// 确定要增加的数据
ContentValues values = new ContentValues();
values.put("stu_name", "Alex");
values.put("stu_phone_number", "010-88668866");
// 执行增加数据
long id = db.insert(table, nullColumnHack, values);
if (id != -1) {
Toast.makeText(this, "增加完成,id=" + id, Toast.LENGTH_SHORT)
.show();
} else {
Toast.makeText(this, "增加失败,原因嘛,不知道", Toast.LENGTH_SHORT).show();
}

delete()

  第1个参数:表名

  第2个参数:where子句,其中各字段对应的值(例如_id=1)可以使用问号(?)表示,如果使用问号,则对应的值需要在第3个参数中体现

  第3个参数:第2个参数中各问号对应的值,如果第2个参数中没有问号,则第3个参数可以为null

  返回值:受影响的行数,即删除的条目数量

eg:

// delete from student where id>1
// delete from student where stu_name='Jack' and
// stu_phone_number='010-88886666'
// 第2个参数:where子句,其中各字段对应的值(例如_id=1)可以使用问号(?)表示,如果使用问号,则对应的值需要在第3个参数中体现
String whereClause = "stu_name=? and stu_phone_number=?";
// 第3个参数:第2个参数中各问号对应的值,如果第2个参数中没有问号,则第3个参数可以为null
String[] whereArgs = { "Jack", "027-66668888" };
int affectedRows = db.delete(table, whereClause, whereArgs);
if (affectedRows > 0) {
Toast.makeText(this, "删除完成,受影响的行数:" + affectedRows,
Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "删除失败,没有符合删除条件的记录!", Toast.LENGTH_SHORT)
.show();
}

update()

eg:

values = new ContentValues();
values.put("stu_phone_number", "10086");
whereClause = "_id=? and stu_name=?";
whereArgs = new String[] { 5 + "", "Rose" };
affectedRows = db.update(table, values, whereClause, whereArgs);
if (affectedRows > 0) {
Toast.makeText(this, "编辑完成,受影响的行数:" + affectedRows,
Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(this, "编辑失败,没有符合删除条件的记录!", Toast.LENGTH_SHORT)
.show();
}


【查询数据】

方法:query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy)

参数说明:

String table:表名

String[] columns:要查询的列(字段),如果为null,则表示查询所有列

String selection:查询条件,即where子句

String[] selectionArgs:查询条件中各问号(?)对应的值

String groupBy:分组子句,暂无视

String having:分组筛选子句,暂无视

String orderBy:排序,例如 _id asc,或 name asc, _id desc

返回值:Cursor

【关于Cursor】

Cursor可以理解为一个表格,表格中是查询出的数据结果。

Cursor在获取数据之前,必须调用move???系列方法确定其位置,然后再获取数据。

推荐使用for循环实现Cursor的遍历:

for(c.moveToFirst(); !c.isAfterLast(); c.moveToNext())

【关于SimpleCursorAdapter】

SimpleCursorAdapter是使用Cursor作为数据源的Adapter。

使用SimpleCursorAdapter时,应该保证在数据源Cursor中存在 _id 字段。

eg:

// 第2个参数,表示要查询的字段的列表,为null值时表示查询所有字段
String[] columns = { "stu_name", "_id", "stu_phone_number" };
// 第3个参数,参考whereClause
String selection = "_id>?";
// 第4个参数,参考whereArgs
String[] selectionArgs = { "0" };
// 第5个参数,分组,暂无视
String groupBy = null;
// 第6个参数,分组后的筛选,暂无视
String having = null;
// 第7个参数,排序,asc表示顺序排列,desc表示倒序排列
String orderBy = "stu_name asc";
// 执行查询
Cursor c = db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy);
for(c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
    String stuId = c.getString(1);
    String stuName = c.getString(0);
    String stuPhoneNumber = c.getString(2);
    Log.d(tag , "id -> " + stuId);
    Log.d(tag, "name -> " + stuName);
    Log.d(tag, "phone number -> " + stuPhoneNumber);
}

【SQLiteOpenHelper】

SQLiteOpenHelper是用于管理数据库的工具,可以实现创建数据库文件、创建数据表等操作,及数据库版本的升级、降级等。

使用SQLiteOpenHelper类定义的getReadableDatabase()或getWritableDatabase()方法可以获取SQLiteDatabase对象,以实现数据访问操作。

eg:

public class DbOpenHelper extends SQLiteOpenHelper {
    public DbOpenHelper(Context context) {
        super(context, "tarena.db", null, 1);
    }
    
    @Override
    public void onCreate(SQLiteDatabase db) {
        // 创建数据表student
        String sql = "CREATE TABLE 'student' ("
        + "_id integer primary key autoincrement, "
        + "stu_name varchar(16) not null, "
        + "stu_phone_number varchar(16) not null unique" + ")";
        db.execSQL(sql);
    }
    
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    // TODO Auto-generated method stub
    }
}

使用SQLite的流程

---------------------------

1. 规划数据库与数据表

2. 自定义类继承自SQLiteOpenHelper,至少重写onCreate()方法,在onCreate()方法中完成所有的初始化操作,例如创建数据表、向数据表中插入默认数据。

3. 创建上述自定义类的对象,调用getReadableDatabase()方法获取SQLiteDatabase对象,以实现数据访问操作。

4. 确定数据访问结束后,关闭相关资源。

© 著作权归作者所有

共有 人打赏支持
粉丝 0
博文 34
码字总数 15605
作品 0
深圳
私信 提问
ODB(C++ ORM)用Mingw的完整编译过程

用mingw官方的GCC4.7.2编译libodb后,并用odb compiler对hello示例生成odb的"包裹"代码,编译链接总是不能通过,下面是编译example/hello报错的信息如下: libodb-sqlite-2.3.0/odb/sqlite -o d...

棋有此理
2013/12/14
0
0
轻巧的本地数据库 - sqlite

  前言   SQLite,是一款轻型的数据库,它的设计目标是嵌入式的,而且现在很多嵌入式产品中使用它,它占资源非常低,在嵌入设备中,可能只需要几百K的内存就够了。它能够支持Windows/Lin...

linux运维菜
11/01
0
0
【原创】如何在 libgda 和 SQLite 之间作出选择

How to choose between Libgda and SQLite 如何在 libgda 和 SQLite 之间作出选择 (本文为官方文档翻译,以中英对照形式呈现) Libgda has been added as a new external dependency for G...

摩云飞
2013/03/20
0
0
【防衰老教程】-windows环境下安装SQLite

什么是 SQLite? SQLite是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。它是一个零配置的数据库,这意味着与其他数据库一样,您不需要在系统中配置。...

Weijue
05/09
0
0
Python中使用SQLite

SQLite: SQLite是一种数据库,Python中集成了SQLite3,所以在Python中使用SQLite,可以直接导入SQLite包,不需要做额外的配置。 更多的SQLite简介和相关知识可以查看专门的教程:http://ww...

akane_oimo
09/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Win10:默认的图片打开应用,打开图片时速度明显很慢的解决办法

首先,我们随便地打开一张图片。然后,点击右上角的三个小点,最后点击弹出菜单最下面的“设置”。如下图: 在“设置”中找到下面的“人物”,把它关掉就好了。 原来,默认情况下,Win 10的图...

LivingInFHL
39分钟前
2
0
js代码激发onchange事件,兼容谷歌火狐IE

var el = document.getElementsByName('role')[0]; el.value = '3'; var evt = document.createEvent("HTMLEvents"); evt.initEvent("change", false, true); el.dispatchEvent(evt);......

我退而结网
53分钟前
3
0
mysql客户端报错:libmysqlclient_16 not defined in file libmysqlclient.so.16

报错情况: 安装完mydumper之后(上一篇文章),登陆Mysql客户端报错:version libmysqlclient_16 not defined in file libmysqlclient.so.16 with link time reference 同样:mysql的其他客...

machogyb
今天
1
0
MySQL 数据库中间件 安装部署测试全过程

1、环境准备 1.1、操作系统环境 [root@MyCat conf]# uname -aLinux MyCat 2.6.32-431.el6.x86_64 #1 SMP Sun Nov 10 22:19:54 EST 2013 x86_64 x86_64 x86_64 GNU/Linux 1.2、关闭SELIN......

PeakFang-BOK
今天
6
0
Linux Mysql 安装

https://www.cnblogs.com/xinjing-jingxin/p/8025805.html

流氓兔-
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部