Android学习:学习使用SQLite数据库(创建数据库,升级数据库,及对数据的CRUD操作)

一、简单的介绍SQLite数据库

1、SQLite 一个非常流行的嵌入式数据库,它支持 SQL 语言,并且只利用很少的内存就有很好的性能。此外它还是开源的,任何人都可以使用它。许多开源项目((Mozilla, PHP, Python)都使用了 SQLite.

2、SQLite 由以下几个组件组成:SQL 编译器、内核、后端以及附件。SQLite 通过利用虚拟机和虚拟数据库引擎(VDBE),使调试、修改和扩展 SQLite 的内核变得更加方便。SQLite 基本上符合 SQL-92 标准,和其他的主要 SQL 数据库没什么区别。它的优点就是高效,Android 运行时环境包含了完整的 SQLite。

3、SQLite 和其他数据库最大的不同就是对数据类型的支持,创建一个表时,可以在 CREATE TABLE 语句中指定某列的数据类型,但是你可以把任何数据类型放入任何列中。当某个值插入数据库时,SQLite 将检查它的类型。如果该类型与关联的列不匹配,则 SQLite 会尝试将该值转换成该列的类型。如果不能转换,则该值将作为其本身具有的类型存储。比如可以把一个字符串(String)放入 INTEGER 列。SQLite 称这为“弱类型”(manifest typing.)。此外,SQLite 不支持一些标准的 SQL 功能,特别是外键约束(FOREIGN KEY constrains),嵌套 transcaction 和 RIGHT OUTER JOIN 和 FULL OUTER JOIN, 还有一些 ALTER TABLE 功能。除了上述功能外,SQLite 是一个完整的 SQL 系统,拥有完整的触发器,交易等等。

4、Android 在运行时集成了 SQLite轻量级关系型数据库,所以每个 Android 应用程序都可以使用 SQLite 数据库。对于熟悉 SQL 的开发人员来时,在 Android 开发中使用 SQLite 相当简单。但是,由于 JDBC 会消耗太多的系统资源,所以 JDBC 对于手机这种内存受限设备来说并不合适。因此,Android 提供了一些新的 API 来使用 SQLite 数据库,Android 开发中,程序员需要学使用这些 API。数据库存储在 data/< 项目文件夹 >/databases/ 下。

注:该介绍摘自https://www.ibm.com/developerworks/cn/opensource/os-cn-sqlite/

二、使用SQLite数据库的界面布局

1、界面布局的代码:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    tools:layout_editor_absoluteY="81dp">

    <Button
        android:id="@+id/create_db"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:text="创建数据库"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
    android:id="@+id/add_data"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:text="添加数据"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@+id/create_db" />

    <Button
        android:id="@+id/select_data"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="96dp"
        android:text="查询数据"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="1.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/create_db" />
    <Button
        android:id="@+id/del_data"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="48dp"
        android:text="删除数据"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/create_db" />

    <Button
        android:id="@+id/update_data"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_marginTop="152dp"
        android:text="修改数据"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/create_db" />
</android.support.constraint.ConstraintLayout>

2、界面布局的效果展示:

二、创建一个MyDBHelper类继承SQLiteOpenHelper

1、SQLiteOpenHelper是一个抽象类,一个帮助类,用于管理数据库创建和版本管理。

  • 有两个抽象方法,onCrearte(SQLiteDatabase db)、onUpdate(SQLiteDatabase db, int oldVersion, int newVersion)。
  • 实现的方法有getReadableDatabase()、getWriteableDatabase()用来创建数据库或者打开一个现有的数据库。

2、MyDBHelper.java代码

package cn.edu.sxy.databasedemo;

import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.widget.Toast;

public class MyDBHelper extends SQLiteOpenHelper {
    //创建Book表的SQL语句
    public static final String CREATE_BOOK = "create table Book(" +
            "id integer primary key autoincrement,"
            + "author text,"
            + "price real,"
            + "pages integer,"
            + "name text)";
    //1.在已经创建Book表的基础上,再创建category表,表的SQL语句如下(增加表)
    private static final String CREATE_CATEGORY = "create table category ("
            + "id integer primary key autoincrement,"
            + "category_name text,"
            + "category_code integer)";
    private Context mContext;

    /**
     * 构造方法
     * @param context
     * @param name
     * @param factory
     * @param version
     */
   public MyDBHelper (Context context, String name, SQLiteDatabase.CursorFactory factory,int version){
       super(context,name,factory,version);
       mContext = context;
   }

    /**
     * 创建数据库
     * @param db
     */
    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_BOOK);
        db.execSQL(CREATE_CATEGORY);//2.新增加category表,还需要在onUpdate()方法中做出修改
        Toast.makeText(mContext,"数据库创建成功",Toast.LENGTH_LONG).show();
    }

    /**
     * 升级数据库
     * @param db
     * @param oldVersion
     * @param newVersion
     */
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        /**
         * 3.在onUpdate()方法中执行两条DROP语句,若数据库中已经存在Book表或Category表,
         * 就将者两张表删除,然后调用onCreate()方法重新创建
         */
        db.execSQL("drop table if exists Book");
        db.execSQL("drop table if exists Category");
        onCreate(db);
    }
}

三、在MainActivity.java中创建数据库,及对数据进行CRUD操作

1、实现代码:

package cn.edu.sxy.databasedemo;

import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {
    private MyDBHelper dbHelper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        /* 4.想要onUpgrade()能够执行,就需要修改SQLiteOpenelper的构造方法,将第
         *  四个参数的值改为比1大的数,该参数表示的是当前数据库的版本号。
         *  例如:dbHelper = new MyDBHelper(this,"BookStore.db",null,2);
         */
        dbHelper = new MyDBHelper(this, "BookStore.db", null, 2);
        Button createDB = findViewById(R.id.create_db);
        createDB.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //调用getWritableDatabase()方法可以创建数据库
                //若有该数据库,则直接打开;否则,重新创建一个数据库
                dbHelper.getWritableDatabase(); //返回的是一个SQLiteDatabase对象
            }
        });
        //添加数据
        Button addData = findViewById(R.id.add_data);
        addData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SQLiteDatabase db = dbHelper.getWritableDatabase();
                ContentValues values = new ContentValues();
                //开始组装第一条数据
                values.put("name", "Think in java(Java编程思想)");
                values.put("author", "XXX");
                values.put("pages", 800);
                values.put("price", 85.36);
                //插入第一条数据
                db.insert("Book", null, values);
                values.clear();
                //开始组装第二条数据
                values.put("name", "Android");
                values.put("author", "XX");
                values.put("pages", 354);
                values.put("price", 45.36);
                //插入第二条数据
                db.insert("Book", null, values);
                Toast.makeText(MainActivity.this, "数据插入成功", Toast.LENGTH_LONG).show();
            }
        });
        //查询数据
        Button queryData = findViewById(R.id.select_data);
        queryData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SQLiteDatabase db = dbHelper.getWritableDatabase();
                //查询Book表中的所有数据
                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 price = cursor.getDouble(cursor.getColumnIndex("price"));
                        Log.d("MainActivity", "书的名字是 :" + name);
                        Log.d("MainActivity", "书的作者是 :" + author);
                        Log.d("MainActivity", "书的页数是 :" + pages);
                        Log.d("MainActivity", "书的价格是 :" + price);
                        Toast.makeText(MainActivity.this, " " + name + " " + author + " " + pages + " " + price, Toast.LENGTH_LONG).show();
                    } while (cursor.moveToNext());
                }
                Toast.makeText(MainActivity.this, "数据查询成功", Toast.LENGTH_LONG).show();
            }
        });
        //修改数据
        Button updateData = findViewById(R.id.update_data);
        updateData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SQLiteDatabase db = dbHelper.getWritableDatabase();
                ContentValues values = new ContentValues();
                values.put("price",30.00);
                db.update("Book",values,"name = ?" ,new String[]{"Think in java(Java编程思想)"});
            }
        });
        //删除数据
        Button delData = findViewById(R.id.del_data);
        delData.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                SQLiteDatabase db = dbHelper.getWritableDatabase();
                db.delete("Book","pages > ?",new String[] {"600"});
                Toast.makeText(MainActivity.this,"页数超过500页的数据删除成功",Toast.LENGTH_LONG).show();
            }
        });
    }
}

 

 

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Android Room是Google为Android平台开发的一个SQLite对象映射数据库框架,它提供了一种简单的方式来访问SQLite数据库。下面是使用Room进行SQLite查询的基本步骤: 1. 定义实体类:在Room中,表是通过实体类来表示的。你需要定义一个Java类来表示数据库中的每个表,并使用注释来指定表名、列名等信息。 2. 定义DAO接口:DAO(Data Access Object)是用于访问数据库的接口。你需要定义一个接口来提供对实体类的CRUD操作。 3. 创建数据库使用Room,你可以在应用程序中创建一个SQLite数据库。你需要创建一个继承自RoomDatabase的抽象类,并定义抽象方法来获取DAO对象。 4. 执行查询操作:在DAO接口中定义查询语句,并在应用程序中调用该方法来执行查询操作。以下是一个使用Room进行查询的示例: ```java @Dao public interface UserDao { @Query("SELECT * FROM user WHERE id = :userId") User getUserById(int userId); @Query("SELECT * FROM user WHERE name LIKE :name") List<User> getUsersByName(String name); @Insert void insertUser(User user); } ``` 在上面的示例中,@Query注释指定了查询语句,getUserById方法根据用户ID查询用户,getUsersByName方法根据名称查询用户,insertUser方法将用户插入数据库。 要使用上述查询方法,你需要创建一个RoomDatabase实例并获取UserDao对象。以下是一个使用Room进行查询的示例: ```java UserDatabase db = Room.databaseBuilder(getApplicationContext(), UserDatabase.class, "user.db").build(); UserDao userDao = db.userDao(); // 根据ID查询用户 User user = userDao.getUserById(1); // 根据名称查询用户 List<User> users = userDao.getUsersByName("John"); // 插入用户 User newUser = new User("Alice", "[email protected]"); userDao.insertUser(newUser); ``` 在上面的示例中,我们创建了一个UserDatabase实例,并使用其userDao()方法获得UserDao对象。然后我们可以使用UserDao对象的方法来执行查询和插入操作

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

shexianyu

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值