推广

Android数据持久化篇(三)—— SQLite数据库的使用

iseeyu2年前 (2024-02-21)推广139

sqLite数据库实例.gif

SqLite的数据库的使用也非常简单,分为下面几步:
(1)创建类继承自SQLiteOpenHelper并复写里面的几个方法。
(2)通过getWritableDatabase()或者getReadableDatabase()创建或者打开一个数据库。
(3)获取SQLite数据库的操作类实例SQLiteDatabase。
(4)进行增删改查。

第一步:创建类继承自SQLiteOpenHelper并复写里面的几个方法

public class DatabaseHelper extends SQLiteOpenHelper {

    public static final String CREATE_BOOK = "create table Book("
            + "id integer primary key autoincrement,"
            + "author text,"
            + "price real,"
            + "pages integer,"
            + "name text)";

    public static final String CREATE_CATEGORY = "create table Category("
            + "id integer primary key autoincrement,"
            + "category_name text,"
            + "category_code integer)";

    private Context mContext;

    /**
     * SQLite的数据库构造方法
     *
     * @param context 上下文
     * @param name    数据库名称
     * @param factory 一个可选的游标工厂(通常是 Null)
     * @param version 当前数据库的版本,值必须是整数并且是递增的状态
     */
    public DatabaseHelper(@Nullable Context context, @Nullable String name, @Nullable SQLiteDatabase.CursorFactory factory, int version) {
        super(context, name, factory, version);
        this.mContext = context;
    }

    /**
     * 对数据库进行初始化操作
     *
     * @param db 数据库操作类
     */
    @Override
    public void onCreate(SQLiteDatabase db) {
        // 创建表名
        db.execSQL(CREATE_BOOK);
        db.execSQL(CREATE_CATEGORY);
        Toast.makeText(mContext, "Book表创建成功", Toast.LENGTH_SHORT).show();
        // 注:数据库实际上是没被创建 / 打开的(因该方法还没调用)
        // 直到getWritableDatabase() / getReadableDatabase() 第一次被调用时才会进行创建 / 打开
    }

    /**
     * 数据库版本切换
     *
     * @param db         数据库操作类
     * @param oldVersion 之前的数据库的版本
     * @param newVersion 设置的数据库的版本
     */
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("drop table if exists Book");
        db.execSQL("drop table if exists Category");
        onCreate(db);
    }
}

在这里需要强调的是onCreate()方法只会执行一次,一般情况下在第一次调用getWritableDatabase()或者getReadableDatabase()的时候会调用,那么当我们在后期需要新增表的时候咋办呢?解决办法有两种:
(1)卸载程序重装(不建议使用)。
(2)更新数据库的版本(推荐使用),在更换数据库版本的时候需要在onUpgrade()方法里面去删除之前存在的表,然后再次创建新的表。

第二步:通过getWritableDatabase()或者getReadableDatabase()创建或者打开一个数据库。

DatabaseHelper mDatabaseHelper = new DatabaseHelper(IApplication.getContext(), "Book.db", null, 1);

需要注意的是,在构造函数里面,第一个传递的是上下文,第二个传递的是数据库的名字,第三个是一个可选的游标工厂,通常情况下设置为null就可以了,第四个参数代表的是当前数据库的版本。

第三步:获取SQLite数据库的操作类实例SQLiteDatabase

SQLiteDatabase db = mDatabaseHelper.getWritableDatabase();

需要说明的是:
getReadableDatabase()和getWritableDatabase()都可以创建或者打开一个数据库。
如果数据库存在则直接打开,如果不存在则直接创建。同时返回一个可对数据库进行读写操作的对象。
二者不同的是,当数据库不可写入的时候(比如磁盘空间已满),getReadableDatabase()方法返回的
对象将以只读的方式去打开数据库,而getWritableDatabase()方法将出现异常。

第四步:进行增删改查

/**
 * 插入数据
 */
public void insertData() {
    ContentValues contentValues = new ContentValues();
    // 开始组装第一条数据
    contentValues.put("name", "android开发艺术");
    contentValues.put("author", "任玉刚");
    contentValues.put("price", 88.8);
    contentValues.put("pages", 778);
    long result = db.insert("Book", null, contentValues);
    if (result > -1) {
        Toast.makeText(IApplication.getContext(), "插入数据成功", Toast.LENGTH_LONG).show();
    }
}

/**
 * 修改数据
 */
public void updateData() {
    ContentValues contentValues = new ContentValues();
    contentValues.put("price", 66.6);
    // String table, ContentValues values, String whereClause, String[] whereArgs
    // 第一个参数对应的是表名
    // 第二个参数对应的是修改内容
    // 第三、四个参数对应的是约束的条件
    long result = db.update("Book", contentValues, "author=?", new String[]{"任玉刚"});
    if (result > -1) {
        Toast.makeText(IApplication.getContext(), "修改数据成功", Toast.LENGTH_LONG).show();
    }
}

/**
 * 删除数据
 */
public void deleteData() {
    // 第一个参数对应的是表名
    // 第二、三个参数对应的是约束的条件
    long result = db.delete("Book", "pages>?", new String[]{"500"});
    if (result > -1) {
        Toast.makeText(IApplication.getContext(), "删除数据成功", Toast.LENGTH_LONG).show();
    }
}

public void queryData() {
    // String table, String[] columns, String selection,String[] selectionArgs, String groupBy, String having,String orderBy
    // 第一个参数代表的是表名
    // 第二个参数代表的是查询的列名
    // 第三个参数代表的是指定where的约束条件
    // 第四个参数代表的是为where中指定的占位符提供具体的值
    // 第五个参数代表的是指定需要group by的列
    // 第六个参数代表的是对group by后的结果进一步约束
    // 第七个参数代表的是指定查询结果的排序方式
    Cursor cursor = db.query("Book", null, null, null, null, null, null);
    if (cursor.moveToFirst()) {
        do {
            // 遍历Cursor对象,取出数据
            String name = cursor.getString(cursor.getColumnIndex("name"));
            String author = cursor.getString(cursor.getColumnIndex("author"));
            int pages = cursor.getInt(cursor.getColumnIndex("pages"));
            double prices = cursor.getDouble(cursor.getColumnIndex("price"));
            String showValue = "书名:" + name + "\t作者名:" + author + "\t总页数:" + pages + "\t价格:" + prices;
            Toast.makeText(IApplication.getContext(), showValue, Toast.LENGTH_LONG).show();
        } while (cursor.moveToNext());
    }
    cursor.close();
}

需要强调的两点是:
1》数据库文件会放在data/data/包名/databases目录下面
2》创建表的时候:
(1)integer表示整型
(2)real表示浮点型
(3)text表示文本类型
(4)blob表示二进制类型
(5)primary key设为主键
(6)autoincrement自增长

总结:SQLite的数据库相对来说稍微复杂一点,因为这和后端的数据库的操作其实并没有太多区别,一样有着增删改查,而麻烦的往往就是自己去实现sql语句,那么有没有什么办法可以避免这种直接的数据库操作呢?答案是有的,下一篇我们继续来了解一下不用写sql语句的数据库操作。

扫描二维码推送至手机访问。

版权声明:本文由西安泽虎代运营发布,如需转载请注明出处。

转载请注明出处https://www.0291.com.cn/post/57524.html

相关文章

优化师在优化网站关键词排名时常遇到的问题。

优化师在优化网站关键词排名时常遇到的问题。

在网站优化过程中,优化师经常会出现一些小问题,导致排名下降。仔细研究发现,很多站长在优化过程中都存在类似的问题,因此排名有所下降。 1、网站肤浅,不注重内容优化 不要总是注重网站表面的优化,真正的网站优化还是内容为王,蜘蛛爬取你的网站,如果没有高质量的内容,蜘蛛抓取不到有营养的东西就会降低网站的...

[SEO文案]在seo优化中文案起到承上启下的作用。

[SEO文案]在seo优化中文案起到承上启下的作用。

质量内容在优化中起着关键作用,更利于用户浏览,满足用户的需求,才有可能提升关键词排名。 实际上,SEO文案的工作是编辑一种可以在网页上查看文本的技术(通常是指网站上文章的内容)。做好SEO文案的目的是解决用户需求,提高关键词的排名。除了撰写文章,SEO文案通常会根据搜索条件优化其他页面的元素。...

淘宝店招怎么上传全屏(全屏店招怎么设置)

淘宝店招怎么上传全屏(全屏店招怎么设置)

如果要上传全屏店招,我们首先要制作一个950的店招,然后,将其上传到店招模块里面,再将延伸版放到页头设置里的背景图里,再将背景对齐模式选择为居中对齐就行。...

抖音小店能不能做?2022抖店还是风口吗?

抖音小店能不能做?2022抖店还是风口吗?

几大老电商平台的销售市场早已饱和状态,头顶部店家占有着绝大多数的总流量,初学者店面难以凭着当然总流量起店,许多是根据掏钱买总流量曝出的方法实现迅速起店的实际效果。 抖音点赞 抖音小店能不能做? 抖音小商店做为一个新的电子商务平台,销售市场...

发布新闻通稿(Press Release)的作用是什么?

发布新闻通稿(Press Release)的作用是什么?

现在企业做,首先想到的就是新闻,新闻营销带给企业带来价值和意义不是三言两语描述得清楚,小马识途顾问觉得成功的新闻稿发布,可以给企业带来如下价值和意义。1、提升品牌形象成功的新闻营销,可以有效的提升品牌的知名度和美誉度。新闻营销不同于广告宣传,广告宣传是将企业的产品硬生生的“...

怎样去推广网站。

怎样去推广网站。

现在互联网上的网站越来越多,制作网站已经不是一件难事,但是对于企业来说,怎样将自己的网站推广出去,却是一个难题,就像在淘宝上开店一样,仅仅只是开店也许很简单,只要是会上网的人都会,但是要怎样去经营它却是一个难倒很多卖家的问题。 由于电子商务的快速发展,SEO也开始发挥作用,那么对于企业来说,网站不...

现在,非常期待与您的又一次邂逅

我们努力让每一部企业宣传片和抖音短视频成为商业大片