Android笔记(二十七)sqlite数据库

本文详细介绍了在Android中如何使用SQLiteOpenHelper创建数据库,包括onCreate()和onUpgrade()方法的使用。接着讲解了增删改查操作,以及如何进行SQL事务处理,确保数据一致性。还探讨了数据库升级的最佳实践,确保在保留旧数据的基础上进行升级,并提到了 LitePal 框架作为替代操作方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、创建数据库
Android 中提供SQLiteOpenHelper类帮助创建一个数据库,SQLiteOpenHelper 是一个抽象类,要创建一个自己的帮助类去继承它,子类至少要实现三个方法:带参的构造方法; onCreate()用来创建数据库;onUpgrade(),用来升级数据库;数据库文件会存放在/data/data//databases/目录下。

public class MydatabaseHelper extends SQLiteOpenHelper {
    // 建表语句,数据类型有integer:整型;real:浮点型;text:文本类型;blob:二进制类型
    public static final String CREAT_PRESON = "create table person ("
            + "id integer primary key autoincrement," + "name text,"
            + "age integer)";

    private Context mContext;

    // 参数依次为上下文,数据库名,自定义Cursor一般为null,数据库版本号
    public MydatabaseHelper(Context context, String name,
            CursorFactory factory, int version) {
        super(context, name, factory, version);
        mContext = context;
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREAT_PRESON);
    }

    @Override
    public void onUpgrade(SQLiteDatabase arg0, int arg1, int arg2) {
        // TODO Auto-generated method stub

    }

}

在Activity中就可以通过MydatabaseHelper建立数据库

        MydatabaseHelper dbHelper = new MydatabaseHelper(this, "School.db",null, 1);
        dbHelper.getWritableDatabase();

数据库总要升级的,此时建立一张teacher表,不能写在onCreate()方法里了,就要用到onUpgrade()方法了,只要在MydatabaseHelper的构造方法里将参数修改为一个比1大的数字,onUpgrade()方法就会执行。

MydatabaseHelper中需要修改的代码:

//新增一条建表语句
public static final String CREATE_TEACHER = "create table teacher("
            + "id integer primary key autoincrement," + "name text,"
            + "age integer)";
//onCreate()
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREAT_PRESON);
        db.execSQL(CREATE_TEACHER);
    }
//onUpgrade
    public void onUpgrade(SQLiteDatabase db, int arg1, int arg2) {
            db.execSQL("drop table if exists person");
            db.execSQL("drop table if exists teacher");
            onCreate(db);
    }

Activity中需要修改的代码:

MydatabaseHelper dbHelper = new MydatabaseHelper(this, "School.db",null, 2);

2、Android增、删、改、查

增加tom、jerry,年龄为20、21

        SQLiteDatabase db = dbHelper.getWritableDatabase();
        ContentValues values = new ContentValues();
        // 开始组装第一条数据,第一个参数为列名
        values.put("name", "tom");
        values.put("age", 20);
        // 参数依次为表名,将某些未赋值列自动赋值null,一般直接传入null,ContentValues
        db.insert("person", null, values);
        values.clear();
        // 开始组装第二条数据
        values.put("name", "jerry");
        values.put("age", 21);
        db.insert("person", null, values);

修改tom年龄为25

        SQLiteDatabase db = dbHelper.getWritableDatabase();
        ContentValues values = new ContentValues();
        values.put("age", 25);
        //参数依次为表名,ContentValues,第三第四个参数表条件,第四个参数为字符串数组
        db.update("person", values, "name = ?", new String[]{"tom"});

查询person表

这里写图片描述

        SQLiteDatabase db = dbHelper.getWritableDatabase();
        Cursor cursor = db.query("person", null, null, null, null, null, null);
        if (cursor.moveToFirst()) {
            do {
                String name = cursor.getString(cursor.getColumnIndex("name"));
                int age = cursor.getInt(cursor.getColumnIndex("age"));
            } while (cursor.moveToNext());
        }
        cursor.close();

删除年龄>23的

        SQLiteDatabase db = dbHelper.getWritableDatabase();
        db.delete("person", "age > ?", new String[] { "23" });

3、sql操作数据库

增:

        SQLiteDatabase db = dbHelper.getWritableDatabase();
        db.execSQL("insert into person (name,age) values (?,?)", new String[] { "xiaoming", "21" });

改:

        SQLiteDatabase db = dbHelper.getWritableDatabase();
        db.execSQL("update person set age = ? where name = ?", new String[] { "30", "xiaoming" });

查:

        SQLiteDatabase db = dbHelper.getWritableDatabase();
        db.rawQuery("select * from person",null);

删:

        SQLiteDatabase db = dbHelper.getWritableDatabase();
        db.execSQL("delete from person where age > ?",new String[]{"23"});

4、使用事务

事务的特性可以保证让某一系列的操作要么全部完成,要么一个都不会完成。将person表中的数据全部删除,替换成新数据。

        SQLiteDatabase db = dbHelper.getWritableDatabase();
        db.beginTransaction();// 开启事务
        try {
            db.delete("person", null, null);
            ContentValues values = new ContentValues();
            values.put("name", "Yates");
            values.put("age", 22);
            db.insert("person", null, values);
            db.setTransactionSuccessful();// 事务执行成功
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            db.endTransaction();//结束事务
        }

5、升级数据库的最佳写法

正式工作中,升级数据库不可能将上个版本的数据库全部删掉,要保证在保留上个版本的数据基础上升级数据库。向上面第二版中要建立新的数据库,可以这么写:

    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        switch (oldVersion) {
        case 1:
            db.execSQL(CREATE_TEACHER);
        default:
        }
    }

如果用户是在第一版的基础上升级,就只会执行db.execSQL(CREATE_TEACHER);如果用户是直接安装的第二版,就会执行onCreate()方法里的

public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREAT_PRESON);
        db.execSQL(CREATE_TEACHER);
    }

这里注意,每一个case后面都是不加break的,当从第一版往上升级时,每一版都会执行。

LitePal框架操作数据库:http://blog.csdn.net/column/details/android-database-pro.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值