SQLite 第一个Alpha版本诞生于2000年5月,它是一款轻型数据库,它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用,它占用的资源非常少,在嵌入式设备中,可能只需要几百kb内存就够了。也许这正是Android系统要采用SQLite数据库的原因之一吧。
SQLite 数据库是 D.Richard Hipp 用C语言编写的开源嵌入式数据库,支持的数据库大小为2TB。它具有如下特征。
1.轻量级
SQLite和C/S模式的数据库软件不同,它是进程内的数据引擎,因此不存在数据库的客户端和服务器。使用SQLite 一般只需要带上它的一个动态库,就可以享受它的全部功能。而且那个动态库的尺寸也相当小。
2.独立性
SQLite数据库的核心引擎本身不依赖第三方软件,使用它也不需要“安装”。所以在部署的时候能省去不少麻烦。
3.隔离性
SQLite 数据库中所有的信息(比如表、视图、触发器) 都包含在一个文件内,方便管理和维护。
4.跨平台
SQLite数据库支持大部分操作系统,除了我们在电脑上使用的操作系统外,很多手机系统同样可以运行,比如Android、Windows Mobile、Sysbin、Palm等。
5.多语言接口
SQLite 数据库支持很多语言接口,比如C/C++、java、Python、dotNet、Ruby、Perl等,得到更多开发者的喜爱。
6.安全性
SQLite 数据库通过数据库级上的独占性和共享锁来实现独立事务处理。这意味着多个进程在同一时间从同一数据库读取数据,但只有一个可以写入数据。在某个进程或线程向数据库执行写操作前,必须获得独占锁定。在发出独占锁定后,其他的读或写操作将不会再发生。
-
public DbHelper(Context context, String name, CursorFactory factory, int version){
-
super(context, name, factory, version);
-
}
此函数中的参数name就是数据库名称,也就是数据库文件名; version则从1开始,当将来数据库的表格以及字段发生变化时,用户可以提高此version,从而触发onUpgrade()达到旧数据升级的效果。在onCreate函数中创建表格:
java代码:
-
public void onCreate(SQLiteDatabase db) {
-
StringBuilder sql = new StringBuilder();
-
sql.append("CREATE TABLE ");
-
sql.append(TBL_NAME);
-
sql.append(" (");
-
sql.append(FIELD_ID + " TEXT PRIMARY KEY NOT NULL, ");
-
sql.append(FIELD_NAME + " TEXT, ");
-
sql.append(FIELD_AGE + " INTEGER");
-
sql.append(");");
-
db.execSQL(sql.toString());
-
}
onCreate函数只会在数据库第一次创建时调用,所以此处适合做一些数据库初始化操作。上面的函数最终实际上效果是执行了SQL语句:
java代码:
向表格中添加数据有两种方式可以向表格中添加数据,一种是通过SQLiteDatabase提供的execSQL函数直接执行SQL指令; 一种是通过SQLiteDatabase提供的insert函数,此函数把SQL语句进行了封装方便用户使用。
通过execSQL("INSERT INTO mytable VALUES('idStr', 'nameStr', 20);");可以插入一条记录,
当插入记录出错时会抛出异常需要处理。
通过insert函数:insert函数需要一个ContentValues类型的值,此类型类似于hashmap,一个key,一个值配成一对。key就是字段名。
java代码:
-
ContentValues v = new ContentValues();
-
v.put("id", "101");
-
v.put("name", "user 101");
-
v.put("age", 44);
-
mDb.insert("mytable", "null", v);
如果v中的key没有完全的指定所有字段,比如少name或者少id,那么记录能否被成功插入要根据表格创建时的字段限制来决定, 比如少name,那么此记录会插入,只是name字段的值为NULL;如果少id,那么记录不会被插入,因为创建时指定了NOT NULL.可以通过以下指令来查看结果:adb shell执行后进入shell;cd /data/data/cn.demo.sqlsqlite3 database.db 进入了sqlite操作界面。.help可以看到命令帮助。
.dump 可以看到数据库中的数据。
为了方便使用,可以自定义一个insert函数,将值通过参数传入,而ContentValues设置则在函数内部实现。
java代码:
-
public void insert(String id, String name, int age) {
-
-
if( mDb == null ) mDb = getWritableDatabase();
-
ContentValues v = new ContentValues();
-
v.put("id", id);
-
v.put("name", name);
-
if(age > 0) v.put("age", age);
-
mDb.insert(TBL_NAME, "null", v);
从表格中查询记录SQL语句:SELECT column list FROM table WHERE expr ORDER BY column list; 通过SQLiteDatabase类的query()函数
Java代码:
-
Cursor SQLiteDatabase.query(String table,
-
String[] columns, String selection, String[] selectionArgs,
-
String groupBy, String having, String orderBy);
Parameters:
table 要更新的记录所在的表名。
values 要更新的字段值。
whereClause Where子句。更新哪些记录。
whereArgs Where子句中的'?'替换串。
执行update操作时,如果只给部分字段赋值,那么update后,没有赋值的字段仍然保持原来的值不变。从表格中删除记录:
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()
|
|
数据库基础概念SQlite 通过文件来保存数据库,一个文件就是一个数据库。数据库里又包含数个表格;每个表格里面包含了多个记录;每个记录由多个字段组成;每个字段都有其对应的值;每个值都可以指定类型。数据库名称即文件名;表格有自己的名称;记录没有名称;每个字段都有名称。在SQlite中,记录没有顺序的概念,不存在第一、第二此类的概念;只能通过
因为之前用的时候都是封装好的,直接调用就好,碰到忘记的时候就百度一下,导致一直记不住,所以今天我觉得有必要抽点时间来
总结
一下这块。
1、创建表:可以通过工具直接创建(注意其主键的设置),也可用sql语句创建
create table if not exists student(_
id
integer primary key autoincrement, name varchar, sex v...
import
android
.annotation.SuppressLint;
import
android
.content.ContentValues;
import
android
.content.Context;
import
android
.database.Cursor;
import
android
.database.
sqlite
.
SQLite
Database;
import andr...
通常使用方法:
//打开或创建
数据
库
SQLite
Database db=openOrCreateDatabase("test.db", Context.MODE_PRIVATE, null);
db.execSQL("DROP TABLE IF EXISTS person");
总结
SQLite
花了好多时间,参考了不少资料。以下知识如果觉得眼熟,不要怀疑,这些
总结
中的代码,虽然很多不是我自己写的,但是这些代码都是通用的。
SQLite
存储并不难,就是麻烦而已,希望下面的
总结
能够对你们有帮助。
Android
中每一个
数据
库对创建它的应用程序包套件来说都是私有的,默认情况下其他应用程序无法直接访问此私有
数据
库。所有的
数据
库文件存放在手机中的/data/dat...
### 回答1:
Android
Studio是一种集成开发环境,用于开发
Android
移动应用程序。而学生信息管理
SQLite
是一种使用
SQLite
数据
库的学生信息管理系统。
在
Android
Studio中,我们可以创建一个新项目来建立学生信息管理系统。首先,我们需要创建一个
SQLite
数据
库,并定义学生的相关信息,如学生
ID
、姓名、年龄、性别等。然后,我们可以使用
SQLite
OpenHelper类来管理
数据
库的创建和版本控制。
在应用程序的界面上,我们可以使用各种
Android
组件来展示学生的信息,如ListView或RecyclerView来展示学生的列表,EditText和Button来添加和修改学生的信息。我们还可以使用SQL语句来进行
数据
库的
查询
和更新操作,如通过姓名
查询
学生、修改学生的年龄等。
为了提高用户体验,我们还可以使用一些
Android
Studio提供的功能和类库,如Shared Preferences来保存用户的配置信息,如排序方式、模糊搜索等。我们还可以使用
Android
的模板和样式来美化界面,使用户操作更加友好和直观。
总而言之,在
Android
Studio中,我们可以使用
SQLite
数据
库来实现学生信息管理系统。通过创建
数据
库、定义表结构、使用SQL语句进行
数据
库操作以及合理运用
Android
Studio提供的功能和类库,我们可以开发一个功能完善、易用且美观的学生信息管理系统。
### 回答2:
在
Android
Studio中使用
SQLite
数据
库进行学生信息管理非常简单。首先,我们需要在项目中创建一个
数据
库和表来存储学生的信息。可以使用
SQLite
OpenHelper类来创建
数据
库和表。
在创建
数据
库时,需要定义
数据
库的名称和版本号,然后在onCreate()方法中创建表,并定义表的列。例如,可以创建一个名为"students"的表,包含
id
、姓名和年龄这三个列。
在应用程序的主界面上,可以使用EditText和Button来输入和保存学生的信息。当用户点击保存按钮时,首先获取EditText中的学生信息并存储在相应的变量中。然后,创建一个ContentValues对象,将学生信息插入到
数据
库表中。
下一步是显示已保存的学生信息。可以使用RecyclerView来显示学生列表。在RecyclerView的适配器中
查询
数据
库,并将
查询
结果显示在列表中。可以将学生的姓名和年龄显示在列表项中,并为每个列表项添加了一个点击事件监听器。
在点击学生列表项时,可以使用Intent来传递学生信息到下一个界面,以便进行学生详细信息的展示和编辑。可以在目标界面使用TextView和EditText来显示和编辑学生信息。并且还可以添加一个删除按钮,让用户可以删除存储在
数据
库中的学生信息。
总结
来说,使用
Android
Studio进行学生信息管理
SQLite
数据
库是一个简单而有用的应用。通过创建
数据
库和表、使用适配器将
数据
展示在RecyclerView中,并使用意图传递
数据
到其他界面,我们可以轻松地实现学生信息的存储、显示和编辑。
### 回答3:
Android
Studio 是一款用于开发
Android
应用程序的集成开发环境。学生信息管理是一个常见的应用场景,可以利用
Android
Studio 结合
SQLite
数据
库来实现。
首先,在
Android
Studio 中创建一个新的项目。在项目的布局文件中,可以设计一个输入学生信息的界面,包括学生的姓名、学号、性别、年龄等信息。
接下来,创建一个 DBHelper 类来管理
数据
库的创建、更新和操作。通过
SQLite
Database 类提供的方法,可以创建
数据
库、创建表、插入
数据
、
查询
数据
等。例如,可以创建一个名为 "students" 的表来存储学生的信息,包括学生的姓名、学号、性别、年龄等字段。
在应用程序的逻辑代码中,可以编写增、删、改、查等操作的方法,并与用户界面进行交互。例如,可以编写一个添加学生信息的方法,当用户在界面上输入学生信息并点击提交按钮时,可以将信息通过 DBHelper 类插入到
数据
库中。另外,也可以编写一个
查询
学生信息的方法,当用户点击
查询
按钮时,可以根据输入的
条
件
查询
数据
库中的学生信息,并在界面上显示
查询
结果。
此外,还可以使用 RecyclerView 来展示学生信息列表,可以通过适配器将
查询
到的
数据
展示在 RecyclerView 中。可以根据学号、姓名等关键字对学生信息进行排序和搜索,并进行相应的响应操作,如删除、修改等。
综上所述,通过使用
Android
Studio 和
SQLite
数据
库,可以实现学生信息的管理功能。这样的应用程序可以方便地记录和管理学生的基本信息,并支持增、删、改、查等操作,提高学校管理的效率和便利性。