Sqlite的介绍以及作用
- SQLite是一个进程内的库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL
数据库引擎。它是一个零配置的数据库,这意味着与其他数据库一样,您不需要在系统中配置。就像其他数据库,SQLite
引擎不是一个独立的进程,可以按应用程序需求进行静态或动态连接。SQLite 直接访问其存储文件。
作用: - 不需要一个单独的服务器进程或操作的系统(无服务器的)。
- SQLite 不需要配置,这意味着不需要安装或管理。
- 一个完整的 SQLite 数据库是存储在一个单一的跨平台的磁盘文件。
- SQLite 是非常小的,是轻量级的,完全配置时小于 400KiB,省略可选功能配置时小于250KiB。
- SQLite 是自给自足的,这意味着不需要任何外部的依赖。
- SQLite 事务是完全兼容 ACID 的,允许从多个进程或线程安全访问。
- SQLite 支持 SQL92(SQL2)标准的大多数查询语言的功能。
- SQLite 使用 ANSI-C 编写的,并提供了简单和易于使用的 API。
- SQLite 可在 UNIX(Linux, Mac OS-X, Android, iOS)和 Windows(Win32, WinCE,WinRT)中运行。
Sqlite创建数据库和数据表
创建一个类继承SQLiteOpenHelper
public class MySqlite extends SQLiteOpenHelper {
private String sql="create table student("+"id integer primary key autoincrement not null,"+
"name text,"+"age integer"+")";
public MySqlite(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
sqLiteDatabase.execSQL(sql);//创建数据库以及数据表
}
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
}
}
添加数据
- 1:new一个ContentValues,该对象提供Put()方法,数据以键值对的形式储存,SQLiteDatabase对象
,提供一个insert()方法,它接受三个参数,第一是表名,第二是在未给指定列赋值时,默认为null,第三就是ContentValues对象。 - 2:就是调用SQLiteDatabase对象 的execSQL()方法,里面传值SQL语句
private void addstudent() {
String name=nameET.getText().toString();
int age= Integer.parseInt(ageET.getText().toString());
ContentValues contentValues=new ContentValues();
contentValues.put("name",name);
contentValues.put("age",age);
MySqlite mySqlite=new MySqlite(this,"sql",null,1);
SQLiteDatabase sqLiteDatabase=mySqlite.getWritableDatabase();
sqLiteDatabase.insert("student",null,contentValues);
}
删除数据
- 1.同上调用delete()方法。第一个参数表名,第二个限定条件,第三个限定条件的值。
2:同上
private void shanchustudent() {
String name=nameET.getText().toString();
MySqlite mySqlite=new MySqlite(this,"sql",null,1);
SQLiteDatabase sqLiteDatabase=mySqlite.getWritableDatabase();
sqLiteDatabase.delete("student","name=?",new String[]{name});
}
修改数据
- 1:同上,new
一个ContentValues对象,用来存放数据,SQLiteDatabase对象调用updata()方法,传入四个参数,第一个表名,第二个需要修改的数据,第三个限定符,表示要修改哪一行等待传值,第四个传值具体修改哪几行。 - 2:SQLiteDatabase对象的execSQL()方法,写入SQL语句。
private void xiugaistudent() {
String name=nameET.getText().toString();
String age= ageET.getText().toString();
MySqlite mySqlite=new MySqlite(this,"sql",null,1);
SQLiteDatabase sqLiteDatabase=mySqlite.getWritableDatabase();
ContentValues contentValues=new ContentValues();
contentValues.put("name",name);
contentValues.put("age",age);
sqLiteDatabase.update("student",contentValues,"name=? and age=?",new String[]{name,age});
inpuireStudent();
}
查询数据
- 1:查询数据需要调用rawQuery()方法,该方法返回值是一个Cursor(游标),利用Cursor遍历查询结果,首先确认cursor是否为空,调用cursor.moveToFirst(),该方法移动Cursor到第一行,如果为空就返回False,否则就是true,在进行循环进行遍历,利用Cursor.GetString(),方法得到该列的具体参数,看到下面代码很多人会疑问,为什么不在.GetString(),方法内直接传入列名,而是又调用了一个Cursor.GetColumnIndex()呢?那是应为.GetString()方法内只接受Int类型的值,而.GetColumnIndex(),接受String值,返回int值,而GetColumnIndex()方法返回的int值是该列的下标,所以利用返回值得相互转变得到我们想要的数据值。简直完美,不是吗?
- 2:调用的是RawQuery()方法,而不是execSQL()方法,里面写入SQL语句,查询全部则第二个限定参数为null,第二个参数类型为newString[]{}类型,用法同上一样,SQL语句?限定,new String[]{}里面给‘?‘赋值。
private void inpuireStudent() {
list.clear();
MySqlite mySqlite=new MySqlite(this,"sql",null,1);
SQLiteDatabase sqLiteDatabase=mySqlite.getWritableDatabase();
Cursor cursor=sqLiteDatabase.query("student",null,null,null,null,null,null);
cursor.moveToFirst();
do {
String name=cursor.getString(cursor.getColumnIndex("name"));
int id=cursor.getInt(cursor.getColumnIndex("id"));
int age=cursor.getInt(cursor.getColumnIndex("age"));
Student student=new Student(name,id,age);
list.add(student);
Log.d(TAG, "inpuireStudent: "+cursor.getString(cursor.getColumnIndex("name")));
}while (cursor.moveToNext());
StudentAdapter studentAdapter=new StudentAdapter(this,list);
listView.setAdapter(studentAdapter);
}