SQLite是一款轻量级的关系型数据库,它的运行速度很快,占用资源少,通常只需要几百K的内存就足够了,因而现在的主流移动设备都使用SQLite作为复杂数据的存储引擎。对于Android来说,系统内置了丰富的API来提供开发人员操作SQLite,从而轻松的实现数据的操作。
1,在android中,已经为我们提供了一个sql的帮助类SQLiteOpenHelper,首先先建一个MySQLiteHelper继承SQLiteOpenHelper,然后重写里面的onCreate()和onUpgrade()方法,onCreate()是在数据库创建成功时回调的,onUpgrade()是在数据库更新时回调的,还有一个onOpen()是在数据库打开时回调的
/**
* Created by wsy on 2017/9/20.
* SQLiteOpenHelper提供了onCreate,onUpgrade等创建更新数据库的方法
* 提供了获取数据库对象的函数
*/
public class MySQLiteHelper extends SQLiteOpenHelper {
/**
*
* @param context 上下文对象
* @param name 创建数据库的名称
* @param factory 游标工厂
* @param version 数据库版本号
*/
public MySQLiteHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version) {
super(context, name, factory, version);
}
public MySQLiteHelper(Context context){
super(context,Constant.DATABASE_NAME,null,Constant.DATABASE_VERSION);
}
/**
* 当数据库创建的时候回调的函数
* @param sqLiteDatabase 数据库对象
*/
@Override
public void onCreate(SQLiteDatabase sqLiteDatabase) {
Log.i("tag", "----------onCreate---------");
String sql = "create table " + Constant.TABLE_NAME + "(" + Constant._ID + " Integer primary key," + Constant.NAME +
" varchar(10)," + Constant.AGE + " Integer)";
Log.i("tag" , sql);
sqLiteDatabase.execSQL(sql);//执行sql语句
}
/**
* 当数据库版本更新的时候回调的函数
* @param sqLiteDatabase 数据库对象
* @param i 数据库旧版本
* @param i1 数据库新版本
*/
@Override
public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) {
Log.i("tag", "----------onUpgrade---------");
}
/**当数据库打开的时候的回调函数
* @param db
*/
@Override
public void onOpen(SQLiteDatabase db) {
super.onOpen(db);
Log.i("tag", "----------onOpen---------");
}
}
这里我们还要重写MySQLiteHelper的构造方法,里面一共有四个参数,context代表上下文对象,name代表创建的数据库的名称,factory代表游标工厂(一般都填null),version代表数据库的版本号。
2,这里我们为了方便管理数据库的名称之类的东西,我们新建一个常量类Constant
/**
* 常量类
* Created by wsy on 2017/9/20.
*/
public class Constant {
public static final String DATABASE_NAME = "info.db";//数据库名称
public static final int DATABASE_VERSION = 1;//数据可版本号
public static final String TABLE_NAME = "person";//表名
public static final String _ID = "_id";
public static final String NAME = "name";
public static final String AGE = "age";
}
在这里设置好数据库名称还有数据库里字段名称等数据,方便管理,
这样在MySQLiteHelper的构造函数里我们 就可以这样写
public MySQLiteHelper(Context context){
super(context,Constant.DATABASE_NAME,null,Constant.DATABASE_VERSION);
3,然后我们新建一个对数据库操作的工具类DbManager,这样使用起来就更加方便,避免代码重复
/**
* 主要是对数据库操作的工具类
* Created by wsy on 2017/9/20.
*/
public class DbManager {
private static MySQLiteHelper helper;
public static MySQLiteHelper getIntance (Context context) {
if (helper == null) {
helper = new MySQLiteHelper(context);
}
return helper;
}
/**
* 根据sql语句在数据库中执行语句
* @param db 数据库对象
* @param sql sql语句
*/
public static void execSQL (SQLiteDatabase db , String sql) {
if (db != null) {
if (sql != null && !"".equals(sql)) {
db.execSQL(sql);
}
}
}
}
4,做好这些准备工作之后,我们就要开始对数据进行创建等操作了,再创建数据库之前,简单介绍一下Sqlite数据库
4.1 sqlite数据库数据类型
常用的有Integer varchar(10) float double char(10) text
4.2 创建表的语句
create table 表名(字段名称 数据类型 约束 ,字段名称 数据类型 约束。。。。。)
create table person(_id Integer primary key , name varchar(10),age Integer not null)
4.3 删除语句
drop table 表名
drop table person
4.4 插入数据语句
insert into 表名[字段,字段(可填可不填)] values(值1,值2.。。。。)
insert into person(_id,age) values(1,20)
insert into person values(1,”wang”,20)
//如果表名后面填写了字段名,则values里的数据要跟字段名 对应上
如果表名后面没有填字段名,则values里的数据根据表里的字段依次填写
4.5 修改数据语句
update 表名 set 字段 = 新值 where 修改的条件
update person set name = “zeng” where _id=1
//如果不添加where语句,代表把表中所有的都修改
如果修改多个字段可以 update person set name = “zeng”,age=20 where _id=1
4.6 删除数据语句
delete from 表名 where 条件
delete from person where _id=2
//如果不写where,则删除表中所有数据
4.7 2.6 查询数据语句
select 字段名 from 表名 where 查询条件 group by 分组的字段 having 筛选条件 order by 排序字段
select * from person //*代表所有
select _id,name from person
select * from person where _id=1
select * from person where _id<>1//<>代表不等于
select * from person where name like “%小%”
select * from person where name like “_小%”
select * from person where name is null
select * from person where age between 10 and 20
select * from person where age >18 order by _id
这些是基本的sql语句
5,接下来我们创建一个activity
对应的xml布局为
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/creat"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="创建数据库"/>
<Button
android:id="@+id/insert"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="插入数据"/>
<Button
android:id="@+id/update"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="修改数据"/>
<Button
android:id="@+id/delete"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="删除数据"/>
<Button
android:id="@+id/insert_api"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="插入数据api"
android:onClick="click"/>
<Button
android:id="@+id/update_api"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="修改数据api"
android:onClick="click"/>
<Button
android:id="@+id/delete_api"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="删除数据api"
android:onClick="click"/>
</LinearLayout>
这里对数据库操作一共有两种办法,一是用sql语句,二是用android封装号的api来操作
这里先介绍用sql语句操作数据库
5.1这里我们需要先得到android提供的sqlite帮助类MySQLiteHelper,
helper = DbManager.getIntance(this);
5.2我们还需要一个数据库对象SQLiteDatabase
SQLiteDatabase db = helper.getWritableDatabase();
这里一共提供了两个方法helper.getWritableDatabase(),helper.getReadableDatabase(),这两个方法都是创建或打开数据库,如果数据库不存在,则创建数据库,如果存在,则打开使用数据库,默认情况下两个函数打开的都是可读可写的数据库对象,如果磁盘已满或者数据库本身权限的情况下helper.getReadableDatabase()打开的是只读数据库
5.3 然后就可以对数据库操作了,这里先介绍插入数据
首先得到数据库对象
db = helper.getWritableDatabase();
然后写好一个插入数据的sql语句
String sql1 = "insert into " + Constant.TABLE_NAME + " values(1 , 'zhangsan' , 20)";
对数据库操作需要用到db.execSQL(sql);,由于我们在前面写的工具类中已经写好了这个方法,所以我们只需要调用就可以了
DbManager.execSQL(db , sql1);
在操作完数据库之后我们要把数据库关掉,为了防止资源占用
在这里给出插入数据,删除数据,修改数据的代码
case R.id.creat://创建数据库按钮
/**
* helper.getWritableDatabase(),helper.getReadableDatabase() 创建或打开数据库,如果数据库不存在,则创建数据库,如果存在,则打开使用数据库
*默认情况下两个函数打开的都是可读可写的数据库对象,如果磁盘已满或者数据库本身权限的情况下helper.getReadableDatabase()
* 打开的是只读数据库
*/
SQLiteDatabase db = helper.getWritableDatabase();
break;
case R.id.insert://插入数据
db = helper.getWritableDatabase();
String sql1 = "insert into " + Constant.TABLE_NAME + " values(1 , 'zhangsan' , 20)";
DbManager.execSQL(db , sql1);
String sql2 = "insert into " + Constant.TABLE_NAME + " values(2 , 'lisi' , 30)";
DbManager.execSQL(db , sql2);
Log.i("tag" , sql1);
db.close();//为了防止资源占用,使用完之后关闭数据库
break;
case R.id.update://修改数据
db = helper.getWritableDatabase();
String updateSql = "update "+Constant.TABLE_NAME+" set "+Constant.NAME+" = 'xiaoming' where "+Constant._ID+" = 1";
Log.i("tag" , updateSql);
DbManager.execSQL(db , updateSql);
db.close();
break;
case R.id.delete://删除数据
db = helper.getWritableDatabase();
String deleteSql = "delete from "+Constant.TABLE_NAME+" where "+Constant._ID+" = 2";
DbManager.execSQL(db , deleteSql);
db.close();
break;
6.第二种方法就是用api来操作数据库
首先还是要先得到数据库对象
SQLiteDatabase db = helper.getWritableDatabase();
api中已经为我们提供好了插入数据的方法db.insert(String table, String nullColumnHack, ContentValues values);
其中有三个参数,
/**
* String table 表名
* String nullColumnHack 数据库不允许整行都是null,这个填null
* ContentValues values 键为string的hashmap
* 返回值long 表示插入数据的列数
*/
这里的ContentValues是我们要对数据库操作的数据的一个hashmap
首先我们创建一个ContentValues对象
ContentValues values = new ContentValues();
然后想插入数据
values.put(Constant._ID , 3);//插入数据库的字段名称和插入数据库的值
values.put(Constant.NAME , "liuwq");
values.put(Constant.AGE , 40);
因为db.insert()方法是一个long型的返回值,所以
long result = db.insert(Constant.TABLE_NAME , null , values);
if (result > 0) {
Toast.makeText(MainActivity.this , "插入数据成功!" , Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(MainActivity.this , "插入数据失败!" , Toast.LENGTH_SHORT).show();
}
如果返回值大于0,说明插入数据成功,反之则失败
这里给出用api对数据库操作的代码
case R.id.insert_api://插入数据
SQLiteDatabase db = helper.getWritableDatabase();
/**
* String table 表名
* String nullColumnHack 数据库不允许整行都是null,这个填null
* ContentValues values 键为string的hashmap
* 返回值long 表示插入数据的列数
*/
ContentValues values = new ContentValues();
values.put(Constant._ID , 3);//插入数据库的字段名称和插入数据库的值
values.put(Constant.NAME , "liuwq");
values.put(Constant.AGE , 40);
long result = db.insert(Constant.TABLE_NAME , null , values);
if (result > 0) {
Toast.makeText(MainActivity.this , "插入数据成功!" , Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(MainActivity.this , "插入数据失败!" , Toast.LENGTH_SHORT).show();
}
break;
case R.id.update_api://修改数据
db = helper.getWritableDatabase();
/**
* String table, 修改数据的表名
* ContentValues values, 键为string的hashmap
* String whereClause, 表示修改的条件
* String[] whereArgs 表示修改条件的占位符
* db.update();返回值为int类型,代表修改的条数
*/
ContentValues contentValues = new ContentValues();
contentValues.put(Constant.NAME , "jiangwb");//put(需要修改的字段值 , 修改后的值)
int count = db.update(Constant.TABLE_NAME , contentValues , Constant._ID + " = 3" , null);
if (count > 0) {
Toast.makeText(MainActivity.this , "修改数据成功!" , Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(MainActivity.this , "修改数据失败!" , Toast.LENGTH_SHORT).show();
}
db.close();
break;
case R.id.delete_api://删除数据
db = helper.getWritableDatabase();
/**
* String table, 修改数据的表名
* String whereClause, 删除的条件
* String[] whereArgs 表示修改条件的占位符
* db.delete();返回值为int类型,代表删除的条数
*/
int count1 = db.delete(Constant.TABLE_NAME , Constant._ID + "=1" , null);
if (count1 > 0) {
Toast.makeText(MainActivity.this , "删除数据成功!" , Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(MainActivity.this , "删除数据失败!" , Toast.LENGTH_SHORT).show();
}
db.close();
break;
}
以上就是两种对sql数据库操作的方法,个人认为第二种比较简单,因为第二种的底层也是用sql语句对数据库操作了,只是android把他封装好了来给我们用,这里给出MainActivity的代码
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private MySQLiteHelper helper;
private Button creat;//创建数据库按钮
private Button insert;//插入数据按钮
private Button update;//修改数据按钮
private Button delete;//删除数据
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
helper = DbManager.getIntance(this);
creat = (Button) findViewById(R.id.creat);
creat.setOnClickListener(this);
insert = (Button) findViewById(R.id.insert);
insert.setOnClickListener(this);
update = (Button) findViewById(R.id.update);
update.setOnClickListener(this);
delete = (Button) findViewById(R.id.delete);
delete.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.creat://创建数据库按钮
/**
* helper.getWritableDatabase(),helper.getReadableDatabase() 创建或打开数据库,如果数据库不存在,则创建数据库,如果存在,则打开使用数据库
*默认情况下两个函数打开的都是可读可写的数据库对象,如果磁盘已满或者数据库本身权限的情况下helper.getReadableDatabase()
* 打开的是只读数据库
*/
SQLiteDatabase db = helper.getWritableDatabase();
break;
case R.id.insert://插入数据
db = helper.getWritableDatabase();
String sql1 = "insert into " + Constant.TABLE_NAME + " values(1 , 'zhangsan' , 20)";
DbManager.execSQL(db , sql1);
String sql2 = "insert into " + Constant.TABLE_NAME + " values(2 , 'lisi' , 30)";
DbManager.execSQL(db , sql2);
Log.i("tag" , sql1);
db.close();//为了防止资源占用,使用完之后关闭数据库
break;
case R.id.update://修改数据
db = helper.getWritableDatabase();
String updateSql = "update "+Constant.TABLE_NAME+" set "+Constant.NAME+" = 'xiaoming' where "+Constant._ID+" = 1";
Log.i("tag" , updateSql);
DbManager.execSQL(db , updateSql);
db.close();
break;
case R.id.delete://删除数据
db = helper.getWritableDatabase();
String deleteSql = "delete from "+Constant.TABLE_NAME+" where "+Constant._ID+" = 2";
DbManager.execSQL(db , deleteSql);
db.close();
break;
}
}
/**
* 用api提供的方法进行插入、修改、删除数据
* @param view
*/
public void click (View view) {
switch (view.getId()) {
case R.id.insert_api://插入数据
SQLiteDatabase db = helper.getWritableDatabase();
/**
* String table 表名
* String nullColumnHack 数据库不允许整行都是null,这个填null
* ContentValues values 键为string的hashmap
* 返回值long 表示插入数据的列数
*/
ContentValues values = new ContentValues();
values.put(Constant._ID , 3);//插入数据库的字段名称和插入数据库的值
values.put(Constant.NAME , "liuwq");
values.put(Constant.AGE , 40);
long result = db.insert(Constant.TABLE_NAME , null , values);
if (result > 0) {
Toast.makeText(MainActivity.this , "插入数据成功!" , Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(MainActivity.this , "插入数据失败!" , Toast.LENGTH_SHORT).show();
}
break;
case R.id.update_api://修改数据
db = helper.getWritableDatabase();
/**
* String table, 修改数据的表名
* ContentValues values, 键为string的hashmap
* String whereClause, 表示修改的条件
* String[] whereArgs 表示修改条件的占位符
* db.update();返回值为int类型,代表修改的条数
*/
ContentValues contentValues = new ContentValues();
contentValues.put(Constant.NAME , "jiangwb");//put(需要修改的字段值 , 修改后的值)
int count = db.update(Constant.TABLE_NAME , contentValues , Constant._ID + " = 3" , null);
if (count > 0) {
Toast.makeText(MainActivity.this , "修改数据成功!" , Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(MainActivity.this , "修改数据失败!" , Toast.LENGTH_SHORT).show();
}
db.close();
break;
case R.id.delete_api://删除数据
db = helper.getWritableDatabase();
/**
* String table, 修改数据的表名
* String whereClause, 删除的条件
* String[] whereArgs 表示修改条件的占位符
* db.delete();返回值为int类型,代表删除的条数
*/
int count1 = db.delete(Constant.TABLE_NAME , Constant._ID + "=1" , null);
if (count1 > 0) {
Toast.makeText(MainActivity.this , "删除数据成功!" , Toast.LENGTH_SHORT).show();
}else {
Toast.makeText(MainActivity.this , "删除数据失败!" , Toast.LENGTH_SHORT).show();
}
db.close();
break;
}
}
}