Android中Sqlite的创建与使用

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;
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值