SQLite简介
-支持高达2TB大小的数据库
-以单个文件的形式存在
-以B-Tree的数据结构形式存储在磁盘
特点主要包括:
1>轻量级 一个动态库、单文件
2>独立性 没有依赖、无需安装
3>隔离性 全部在一个文件夹中
4>跨平台 支持众多操作系统
5>多语言接口,支持众多编程语言
关于事务处理的安全性问题:
-通过数据库上的独占性和共享锁来实现独立事务处理
-多个进程可以在同一时间从统一数据库读取数据,但只有一个可以写入数据
关于SQLite的数据类型:
-SQLite支持NULL,INTEGER,REAL,TEXT和Blob数据类型
-依次代表:空值、整型值、浮点值、字符串值、二进制对象
动态数据类型(弱引用)
-当某个值插入到数据库时,SQLite将会检查它的类型,如果该类型与关联的项不匹配,SQLite会尝试将该值转换成该列的类型,如果不能转换,则该值将作为本身的类型存储。
使用须知:
-由于资源占用少、性能良好和零管理成本,嵌入式数据库有了它的用武之地。例如Android,ios
-没有可用于SQLite的网络服务器、只能通过网络共享可能存在文件锁定或者性能问题
-只提供数据库级的锁定
-没有用户账户概念,而是根据文件系统确定所有数据库的权限
SQLiteDatabase:
-提供了一些管理SQLite数据库的类
-提供创建、删除、执行SQL命令,并执行其他常见的数据库管理任务的方法
db.excSQL(sql);//执行任何SQL语句
db.insert(table,nullColumnHack,values)
db.delete(table,whereClasuse,whereArgs)
db.query(table,columns,selection,selectionArgs,groupBy,having,orderBy)
db.rawQuery(sql,selectionArgs)
Cursor:游标接口,提供了遍历查询结果的方法,如移动制作方法move(),获得列值方法getString()等,常用方法
getCount()总记录条数
isFirst()判断是否第一条记录
isLast()判断是否最后一条记录
moveToFirst()移动到第一条记录
moveToLast()移动到最后一条记录
move(int offset)移动到指定记录
moveToNext()移动到下一记录
moveToPrevious()移动到上一条记录
getColumnIndexOrThrow(String columnName)据列名称获得列索引
getInt(int columnIndex)获得指定列索引的int类型值
getString(int columnIndex)获得指定列索引的String类型值
【注意】
使用完Cursor记得close,还要close数据库
使用sql语句操作数据库
public class MainActivity extends AppCompatActivity {
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_layout);
//每个程序都有自己的数据库,默认情况下是各自互相不干扰
SQLiteDatabase db = openOrCreateDatabase("user.db",MODE_PRIVATE,null);
db.execSQL("create table if not exists tb_user(_id integer primary key autoincrement," +
"name text not null,age integer not null)");
db.execSQL("insert into tb_user(name,age) values('张三',15)");
db.execSQL("insert into tb_user(name,age) values('李四',19)");
db.execSQL("insert into tb_user(name,age) values('王五',14)");
Cursor c = db.rawQuery("select * from tb_user",null);//第二个参数是筛选条件
if(c != null){
while(c.moveToNext()){
Log.i("tag", "id_:"+c.getString(c.getColumnIndex("_id")));
Log.i("tag", "name:"+c.getString(c.getColumnIndex("name")));
Log.i("tag", "age:"+c.getInt(c.getColumnIndex("age")));
Log.i("tag", "!!!!!!!!!!!!!!!!!!!!!!!");
}
c.close();//记得关闭Cursor
}
db.close();//最后关闭数据库
}
}
Contentvalues:
用于存储一组可以被ContentResolver处理的值
-ContentValues values = new ContentValues();//类似于hashMap key values
-values.put(“name”,”张三”);
-执行对应的sql操作
package com.example.angel.sqlitepro;
public class MainActivity extends AppCompatActivity {
private static final String TABLENAME = "tb_stu";
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
SQLiteDatabase db = openOrCreateDatabase("user.db",MODE_PRIVATE,null);
//使用内置函数
db.execSQL("create table if not exists "+TABLENAME+" (_id integer primary key " +
"autoincrement,name text not null,age integer not null)");
ContentValues values = new ContentValues();
values.put("name","张三");
values.put("age",15);
long rowId = db.insert(TABLENAME,null,values);
values.clear();
values.put("name","李四");
values.put("age",13);
db.insert(TABLENAME,null,values);
values.clear();
values.put("name","王五");
values.put("age",15);
db.insert(TABLENAME,null,values);
values.clear();
values.put("name","赵六");
values.put("age",19);
db.insert(TABLENAME,null,values);
values.clear();
//db.update(TABLENAME,values,"_id>?",new String[]{"2"});//将全部id大于2 的人年龄成20
// db.delete(TABLENAME,"name like ?",new String[]{"%六"});
Cursor c = db.query(TABLENAME,null,"_id>?",new String[]{"0"},null,null,"name");
if(c != null){
String[] columns =c.getColumnNames();
while(c.moveToNext()){
for(String columnName:columns){
Log.i("tag", c.getString(c.getColumnIndex(columnName)));
}
}
c.close();
}
db.close();
}
}