SQLite数据库的简单应用;

一、SQLite语句;

在活动中的实例;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);

		//打开或创建test.db数据库
		SQLiteDatabase db = openOrCreateDatabase("test.db", Context.MODE_PRIVATE, null);
		db.execSQL("DROP TABLE IF EXISTS person");
		//创建person表
		db.execSQL("CREATE TABLE person (_id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR, age SMALLINT)");
		Person person = new Person();
		person.name = "john";
		person.age = 30;
		//插入数据
		db.execSQL("INSERT INTO person VALUES (NULL, ?, ?)", new Object[]{person.name, person.age});

		person.name = "david";
		person.age = 33;
		//ContentValues以键值对的形式存放数据
		ContentValues cv = new ContentValues();
		cv.put("name", person.name);
		cv.put("age", person.age);
		//插入ContentValues中的数据
		db.insert("person", null, cv);

		cv = new ContentValues();
		cv.put("age", 35);
		//更新数据
		db.update("person", cv, "name = ?", new String[]{"john"});

		Cursor c = db.rawQuery("SELECT * FROM person WHERE age >= ?", new String[]{"33"});
		while (c.moveToNext()) {
			int _id = c.getInt(c.getColumnIndex("_id"));
			String name = c.getString(c.getColumnIndex("name"));
			int age = c.getInt(c.getColumnIndex("age"));
			Log.i("db", "_id=>" + _id + ", name=>" + name + ", age=>" + age);
		}
		c.close();

		//删除数据
		db.delete("person", "age < ?", new String[]{"35"});

		//关闭当前数据库
		db.close();

		//删除test.db数据库
//		deleteDatabase("test.db");
	}

二、更常用的是SQLiteOpenHelper这个类;

比如我们创建DBHelper继承SQLiteOpenHelper;

 1 package com.scott.db;
 2
 3 import android.content.Context;
 4 import android.database.sqlite.SQLiteDatabase;
 5 import android.database.sqlite.SQLiteOpenHelper;
 6
 7 public class DBHelper extends SQLiteOpenHelper {
 8
 9     private static final String DATABASE_NAME = "test.db";
10     private static final int DATABASE_VERSION = 1;
11
12     public DBHelper(Context context) {
13         //CursorFactory设置为null,使用默认值
14         super(context, DATABASE_NAME, null, DATABASE_VERSION);
15     }
16
17     //数据库第一次被创建时onCreate会被调用
18     @Override
19     public void onCreate(SQLiteDatabase db) {
20         db.execSQL("CREATE TABLE IF NOT EXISTS person" +
21                 "(_id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR, age INTEGER, info TEXT)");
22     }
23
24     //如果DATABASE_VERSION值被改为2,系统发现现有数据库版本不同,即会调用onUpgrade
25     @Override
26     public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
27         db.execSQL("ALTER TABLE person ADD COLUMN other STRING");
28     }
29 }

可以看到首先我们定义了我们数据库的名字;

然后构造函数中需要传入context类,并且调用父类构造函数;传入的参数依次为context类,数据库名字;和cursorfactory类,暂时传入null,最后为数据库的版本;

1.当我们首次创建数据库时会调用oncreate方法;比如我们可以创建一张表来保存我们要保存的数据;

2.当我们的数据库版本发生改变时会调用onupgrade方法;

三、当我们创建好我们的openhelper时,我们需要封装我们对数据库操作的方法;

创建DBmanager来管理我们的数据库;

package com.scott.db;

import java.util.ArrayList;
import java.util.List;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

public class DBManager {
    private DBHelper helper;
    private SQLiteDatabase db;

    public DBManager(Context context) {
        helper = new DBHelper(context);
        //因为getWritableDatabase内部调用了mContext.openOrCreateDatabase(mName, 0, mFactory);
        //所以要确保context已初始化,我们可以把实例化DBManager的步骤放在Activity的onCreate里
        db = helper.getWritableDatabase();
    }

    /**
     * add persons
     * @param persons
     */
    public void add(List<Person> persons) {
        db.beginTransaction();    //开始事务
        try {
            for (Person person : persons) {
                db.execSQL("INSERT INTO person VALUES(null, ?, ?, ?)", new Object[]{person.name, person.age, person.info});
            }
            db.setTransactionSuccessful();    //设置事务成功完成
        } finally {
            db.endTransaction();    //结束事务
        }
    }

    /**
     * update person‘s age
     * @param person
     */
    public void updateAge(Person person) {
        ContentValues cv = new ContentValues();
        cv.put("age", person.age);
        db.update("person", cv, "name = ?", new String[]{person.name});
    }

    /**
     * delete old person
     * @param person
     */
    public void deleteOldPerson(Person person) {
        db.delete("person", "age >= ?", new String[]{String.valueOf(person.age)});
    }

    /**
     * query all persons, return list
     * @return List<Person>
     */
    public List<Person> query() {
        ArrayList<Person> persons = new ArrayList<Person>();
        Cursor c = queryTheCursor();
        while (c.moveToNext()) {
            Person person = new Person();
            person._id = c.getInt(c.getColumnIndex("_id"));
            person.name = c.getString(c.getColumnIndex("name"));
            person.age = c.getInt(c.getColumnIndex("age"));
            person.info = c.getString(c.getColumnIndex("info"));
            persons.add(person);
        }
        c.close();
        return persons;
    }

    /**
     * query all persons, return cursor
     * @return    Cursor
     */
    public Cursor queryTheCursor() {
        Cursor c = db.rawQuery("SELECT * FROM person", null);
        return c;
    }

    /**
     * close database
     */
    public void closeDB() {
        db.close();
    }
}

1.首先我们要定义我们的构造函数,因为我们的openhelper需要传入一个context对象,所以我们的DBManager也需要传入context来生成openhelper;所以构造函数中生成一个helper并且,获得一个可以操作的数据库,一般用helper的getWritableDatabase方法;

2.首先数据库manager的基本功能应该包括,打开关闭数据库,添加数据,删除数据,查找数据,更新数据等基本功能;

3.添加数据,首先我们要传入数据,比如传入一个数据列表list;

此时运用了事务管理;这样可以防止数据只插入部分,当我们不开启事务时默认每插入一条数据作为一个事务,这样既浪费时间又容易造成数据缺失,开启事务后我们可以把多条数据作为一个事务,数据都插入后设置事务成功,并且关闭事务;

4.更新删除关闭数据库直接调用数据库方法;

5.查找数据时,我们要定义一个Cursor类作为可以说和指针作用差不多;然后依次查找就可以了;

四、SQLite基本语法;

结构定义
CREATE TABLE
创建新表。

语法:

sql-command ::= CREATE [TEMP | TEMPORARY] TABLE table-name (
    
column-def [column-def]*
    
[constraint]*
)
sql-command ::= CREATE [TEMP | TEMPORARY] TABLE [database-name.] table-name AS select-statement
column-def ::= name [type] [[CONSTRAINT name] column-constraint]*
type ::= typename |
typename ( number ) |
typename ( number , number )
column-constraint ::= NOT NULL [ conflict-clause ] |
PRIMARY KEY 
[sort-order] [ conflict-clause ] |
UNIQUE 
[ conflict-clause ] |
CHECK ( 
expr ) [ conflict-clause ] |
DEFAULT 
value |
COLLATE 
collation-name
constraint ::= PRIMARY KEY ( column-list ) [ conflict-clause ] |
UNIQUE ( 
column-list ) [ conflict-clause ] |
CHECK ( 
expr ) [ conflict-clause ]
conflict-clause ::= ON CONFLICT conflict-algorithm
CREATE VIEW
创建一个视图(虚拟表),该表以另一种方式表示一个或多个表中的数据。

语法:

sql-command ::= CREATE [TEMP | TEMPORARY] VIEW [database-name.] view-name AS select-statement

例子:
CREATE VIEW master_view AS
    SELECT * FROM sqlite_master WHERE type=‘view‘;
说明:
创建一个名为master_view的视图,其中包括sqlite_master这个表中的所有视图表。

CREATE TRIGGER

创建触发器,触发器是一种特殊的存储过程,在用户试图对指定的表执行指定的数据修改语句时自动执行。

语法:

sql-statement ::= CREATE [TEMP | TEMPORARY] TRIGGER trigger-name [ BEFORE | AFTER ]
database-event ON [database-name .] table-name
trigger-action
sql-statement ::= CREATE [TEMP | TEMPORARY] TRIGGER trigger-name INSTEAD OF
database-event ON [database-name .] view-name
trigger-action
database-event ::= DELETE | 
INSERT 
| 
UPDATE 
| 
UPDATE OF 
column-list
trigger-action ::= [ FOR EACH ROW | FOR EACH STATEMENT ] [ WHEN expression ] 
BEGIN 
    
trigger-step ; [ trigger-step ; ]*
END
trigger-step ::= update-statement | insert-statement | 
delete-statement | select-statement

例子:
CREATE TRIGGER update_customer_address UPDATE OF address ON customers 
  BEGIN
    UPDATE orders SET address = new.address WHERE customer_name = old.name;
  END;
说明:
创建了一个名为update_customer_address的触发器,当用户更新customers表中的address字段时,将触发并更新orders表中的address字段为新的值。
比如执行如下一条语句:
UPDATE customers SET address = ‘1 Main St.‘ WHERE name = ‘Jack Jones‘;
数据库将自动执行如下语句:
UPDATE orders SET address = ‘1 Main St.‘ WHERE customer_name = ‘Jack Jones‘;

CREATE INDEX
为给定表或视图创建索引。

语法:

sql-statement ::= CREATE [UNIQUE] INDEX index-name 
ON 
[database-name .] table-name ( column-name [column-name]* )
[ ON CONFLICT conflict-algorithm ]
column-name ::= name [ COLLATE collation-name] [ ASC | DESC ]

例子:
CREATE INDEX idx_email ON customers (email);
说明:
为customers表中的email创建一个名为idx_email的字段。

结构删除
DROP TABLE
删除表定义及该表的所有索引。

语法:

sql-command ::= DROP TABLE [database-name.] table-name

例子:
DROP TABLE customers;

DROP VIEW

删除一个视图。

语法:

sql-command ::= DROP VIEW view-name

例子:
DROP VIEW master_view;

DROP TRIGGER
删除一个触发器。

语法:

sql-statement ::= DROP TRIGGER [database-name .] trigger-name

例子:
DROP TRIGGER update_customer_address;

DROP INDEX
删除一个索引。

语法:

sql-command ::= DROP INDEX [database-name .] index-name

例子:
DROP INDEX idx_email;

数据操作
INSERT
将新行插入到表。

语法:

sql-statement ::= INSERT [OR conflict-algorithm] INTO [database-name .] table-name [(column-list)]VALUES(value-list|
INSERT 
[OR conflict-algorithm] INTO [database-name .] table-name [(column-list)] select-statement
UPDATE
更新表中的现有数据。

语法:

sql-statement ::= UPDATE [ OR conflict-algorithm ] [database-name .] table-name
SET 
assignment [assignment]*
[WHERE expr]
assignment ::= column-name = expr
DELETE
从表中删除行。

语法:

sql-statement ::= DELETE FROM [database-name .] table-name [WHERE expr]
SELECT
从表中检索数据。

语法:

sql-statement ::= SELECT [ALL | DISTINCT] result [FROM table-list]
[WHERE expr]
[GROUP BY expr-list]
[HAVING expr]
[compound-op select]*
[ORDER BY sort-expr-list]
[LIMIT integer [( OFFSET | , ) integer]]
result ::= result-column [result-column]*
result-column ::= | table-name . * | expr [ [AS] string ]
table-list ::= table [join-op table join-args]*
table ::= table-name [AS alias] |
select ) [AS alias]
join-op ::= | [NATURAL] [LEFT | RIGHT | FULL] [OUTER | INNER | CROSS] JOIN
join-args ::= [ON expr] [USING ( id-list )]
sort-expr-list ::= expr [sort-order] [expr [sort-order]]*
sort-order ::= [ COLLATE collation-name ] [ ASC | DESC ]
compound_op ::= UNION | UNION ALL | INTERSECT | EXCEPT
REPLACE
类似INSERT

语法:

sql-statement ::= REPLACE INTO [database-name .] table-name [column-list )] VALUES ( value-list ) |
REPLACE INTO 
[database-name .] table-name [column-list )] select-statement
事务处理
BEGIN TRANSACTION
标记一个事务的起始点。

语法:

sql-statement ::= BEGIN [TRANSACTION [name]]
END TRANSACTION
标记一个事务的终止。

语法:

sql-statement ::= END [TRANSACTION [name]]
COMMIT TRANSACTION
标志一个事务的结束。

语法:

sql-statement ::= COMMIT [TRANSACTION [name]]
ROLLBACK TRANSACTION
将事务回滚到事务的起点。

语法:

sql-statement ::= ROLLBACK [TRANSACTION [name]]
其他操作
COPY
主要用于导入大量的数据。

语法:

sql-statement ::= COPY [ OR conflict-algorithm ] [database-name .] table-name FROM filename
[ USING DELIMITERS delim ]

例子:
COPY customers FROM customers.csv;

EXPLAIN

语法:

sql-statement ::= EXPLAIN sql-statement
PRAGMA
语法:

sql-statement ::= PRAGMA name [value] |
PRAGMA 
function(arg)
VACUUM
语法:

sql-statement ::= VACUUM [index-or-table-name]
ATTACH DATABASE
附加一个数据库到当前的数据库连接。

语法:

sql-statement ::= ATTACH [DATABASE] database-filename AS database-name
DETTACH DATABASE
从当前的数据库分离一个使用ATTACH DATABASE附加的数据库。

语法:

sql-command ::= DETACH [DATABASE] database-name

SQLite内建函数表

算术函数
abs(X) 返回给定数字表达式的绝对值。
max(X,Y[,...]) 返回表达式的最大值。
min(X,Y[,...]) 返回表达式的最小值。
random(*) 返回随机数。
round(X[,Y]) 返回数字表达式并四舍五入为指定的长度或精度。
字符处理函数
length(X) 返回给定字符串表达式的字符个数。
lower(X) 将大写字符数据转换为小写字符数据后返回字符表达式。
upper(X) 返回将小写字符数据转换为大写的字符表达式。
substr(X,Y,Z) 返回表达式的一部分。
randstr()  
quote(A)  
like(A,B) 确定给定的字符串是否与指定的模式匹配。
glob(A,B)  
条件判断函数
coalesce(X,Y[,...])  
ifnull(X,Y)  
nullif(X,Y)  
集合函数
avg(X) 返回组中值的平均值。
count(X) 返回组中项目的数量。
max(X) 返回组中值的最大值。
min(X) 返回组中值的最小值。
sum(X) 返回表达式中所有值的和。
其他函数
typeof(X) 返回数据的类型。
last_insert_rowid() 返回最后插入的数据的ID。
sqlite_version(*) 返回SQLite的版本。
change_count() 返回受上一语句影响的行数。
last_statement_change_count()  
时间: 2024-12-23 06:26:09

SQLite数据库的简单应用;的相关文章

Android中SQLite数据库的简单使用

File file = new File("hah.txt"); //只是创建了一个对象file, file指向了hah.txt这个文件,hah.txt这个文件可能存在,也可能不存在.如果文件不存在,则不会被创建. 必须要有文件输出流对文件进行了写的操作,文件才会被创建. 游标:在访问数据库中表结构时,想访问表中的某一行的时候,数据库内部有一个快速的定位方式,这个定位方式是通过索引来实现的.游标相当于数组的指针,通过游标的上下移动来查找数据. 在Android中使用SQLite数据库,

sqlite数据库之简单操作

一 sqlite介绍 Sqlite是一种嵌入式数据库,类似于一个文件系统,是跟程序在一起的.跟mysql等数据库程序跟数据分离是不一样的. 应用场景:常用于保存本地配置,类似于本地文件系统,因此他内嵌于linux,安卓,ios等系统中,使用时候不需要重新安装.例如:手机端的本地联系人,历史访问记录等等本地数据基本上使用sqlite数据进行保存. 二 使用 //创建表 Create table if not exists persion (_id integer primary key autoi

【Anroid进阶】SQLite数据库使用完全详解

在Android开发中,我们一般可以使用文件.sharedpreferences.以及数据库来保存我们程序运行中产生的数据,本篇主要讲解如何使用SQLite数据库,完成数据的增删改查的一般操作 SQLite介绍 SQLite 一个非常流行的嵌入式数据库,它支持 SQL 语言,并且只利用很少的内存就有很好的性能.此外它还是开源的,任何人都可以使用它. SQLite 和其他的主要 SQL 数据库没什么区别.它的优点就是高效,Android 运行时环境包含了完整的 SQLite. SQLite 和其他

Python解析excel文件并存入sqlite数据库

功能:1.数据库设计 建立数据库2.Python解析excel文件3.Python读取文件名并解析4.将解析的数据存储入库 一 建立数据库 根据需求建立数据库,建立了两个表,并保证了可以将数据存储到已有的数据库中,代码如下: import sqlite3 def createDataBase(): cn = sqlite3.connect('check.db') cn.execute('''CREATE TABLE IF NOT EXISTS TB_CHECK (ID integer PRIMA

Android学习笔记(42):SQLite数据库

(1)SQLite数据库 先简单介绍一下SQLite数据库: 2000年由D.Richard Hipp发布. 是一款轻型.开源嵌入式关系数据库,占用资源非常低.目前用于很多嵌入式产品中,在嵌入式设备中,SQLite可能只需要几百K的内存就够了. 与Mysql.PostgreSQL这两款开源世界著名的数据库管理系统相比,它的处理速度更快. 在Android平台下,除了可以在Android程序中操作SQLite数据库之外,还可以在命令行模式下进行各种数据库的操作,包括表的各种操作,对数据的增加.删除

SQLite数据库和JPA简单介绍

SQLite数据库和JPA简单介绍 一.SQLite简单使用 SQLite是遵循ACID的关系数据库管理系统,它的处理速度很快,它的设计目标是嵌入式的,只需要几百K的内存就可以了. 1.下载SQLitehttp://www.sqlite.org/download.htmlsqlite-dll-win32-x86-201410071659.zip(294.11 KiB)sqlite-shell-win32-x86-3080600.zip解压在文件夹D:\Database\sqlite下,得到文件s

小白5分钟上手c#数据库操作(一) 搭建简单的Sqlite数据库

搭建好Sqlite数据库环境,构建一个简单的SQlite数据库文件 1. 安装 SQlite Database Browser 2. 新建一个数据库 3. 新建一张表 4. 添加一些字段 5. 添加数据 保存,命名为Student.db OK, 用了几分钟我们的数据库已经准备妥当,下面就开始通过c#操作数据库. 原文地址:https://www.cnblogs.com/chenyingzuo/p/12099451.html

SQLite数据库框架--FMDB简单介绍

1.什么是FMDB FMDB是iOS平台的SQLite数据库框架 FMDB以OC的方式封装了SQLite的C语言API 2.FMDB的优点 使用起来更加面向对象,省去了很多麻烦.冗余的C语言代码 对比苹果自带的Core Data框架,更加轻量级和灵活 提供了多线程安全的数据库操作方法,有效地防止数据混乱 3.FMDB的github地址 https://github.com/ccgus/fmdb 二.核心类 FMDB有三个主要的类 (1)FMDatabase 一个FMDatabase对象就代表一个

【Android】Sqlite数据库增删改查

Android系统内置一个Sqlite数据库,如果app需要使用Sqlite数据库数据库存储数据,Android会为此app生成一个.db文件.这个数据库在data/data/<package_name>/databases里面,其中<package_name>为该安卓app的工程包名,这个目录必须root后才能看到.在Windows,单机的应用程序,存储数据,基本放到一个文件里面,正如游戏的存档,基本就是把当前的游戏状态存到一个用户很难找到的文件里面.每次存档读档就是一个从这个存