Android——SQLite 数据库存储

Android 为了让我们更加方便地管理数据库,专门提供了一个 SQLiteOpenHelper 帮助类,借助这个类可以简单地对数据库继续宁创建和升级。

SQLiteOpenHelper 的基本用法:

SQL... 是一个抽象类,使用的话,需要创建一个自己的帮助类去继承它,有两个抽象方法:onCreate() 和 onUpgrade() ,需要在自己的帮助类中重写这两个方法,然后分别在这两个方法中去实现创建、升级数据库的逻辑。

SQL... 两个实例方法:getReadableDatabase() 和 getWritableDatabase() 。这两个方法都可以创建或打开一个现有的数据库(如果数据库已存在则直接打开,否则创建新的),并返回一个可对数据库进行读写操作的对象。

SQL...的构造方法:4个参数,1-Context,2-数据库名,3-Cursor(null),4-当前数据库版本号,可用于对数据库进行升级操作。

构建出 SQLiteOpenHelper 的实例之后,再调用它的 getReadableDatabase() 或 getWritableDatabase() 方法就可以创建数据库了。

 

1. 新建 MyDatabaseHelper 类 继承自 SQLiteOpenHelper,在代码中执行SQL语句创建表

public class MyDatabaseHelper extends SQLiteOpenHelper {

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

    private Context mContext;

    public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version){
        super(context, name, factory, version);
        mContext = context;
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_BOOK);
        Toast.makeText(mContext, "Create succeeded", Toast.LENGTH_SHORT).show();
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    }
}

2. activity_main.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/create_database"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Create database" />
</LinearLayout>

3. MainActivity.java

public class MainActivity extends AppCompatActivity {
    
    private MyDatabaseHelper dbHelper;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        dbHelper = new MyDatabaseHelper(this, "BookStore.db", null, 1);
        Button createDatabase = (Button) findViewById(R.id.create_database);
        createDatabase.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dbHelper.getWritableDatabase();
            }
        });
    }
}

  在 onCreate() 方法中构建了一个 MyDatabaseHelper 对象,并且通过构造函数的参数将数据库名指定为 BookStore.db, 版本号指定为 1,然后在 Create database 按钮的点击事件里调用了 getWritableDatabase() 方法,创建数据库并调用 MyDatabaseHelper 中的 onCreate() 方法。

打开 AS右下角的 Device File Explorer 找到 BookStore.db

右键另存为到桌面上,使用 SQLiteStudio 软件打开,如下

 

升级数据库

onUpgrade() 方法,对数据库进行升级

目前 DatabaseTest 项目中已经有一张 Book 表用于存放书的各种详细数据,再添加一张 Category 表用于记录图书的分类

将建表语句添加到 MyDatabaseHelper 中:

public class MyDatabaseHelper 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;

    public MyDatabaseHelper(Context context, String name, SQLiteDatabase.CursorFactory factory, int version){
        super(context, name, factory, version);
        mContext = context;
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(CREATE_BOOK);
        db.execSQL(CREATE_CATEGORY);
        Toast.makeText(mContext, "Create succeeded", Toast.LENGTH_SHORT).show();
    }

    @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);
    }
}

  在 onUpgrade() 方法中执行了两条 DROP 语句,如果发现数据库中已经存在 Book表 或 Category 表,就把这两张表删除掉,再调用 onCreate() 方法重新创建。

修改 MainActivity 中的代码,版本号传入比 1 大的数

public class MainActivity extends AppCompatActivity {

    private MyDatabaseHelper dbHelper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        dbHelper = new MyDatabaseHelper(this, "BookStore.db", null, 2);
        Button createDatabase = (Button) findViewById(R.id.create_database);
        createDatabase.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                dbHelper.getWritableDatabase();
            }
        });
    }
}

重新运行,查看数据库如下:

 

添加数据

SQLiteDatabase 提供了一个 insert() 方法,用于添加数据,接收 3 个参数:1-表名,2-null,3-ContentValues对象,提供了一系列的 put() 方法重载,用于向 ContentValues 中添加数据,只需要将表中每个列名以及相应的待添加数据传入即可。

修改 activity_main.xml 添加一个按钮:

<Button
        android:id="@+id/add_data"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Add data" />

修改 MainActivity.java :

Button addData = (Button)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", "The Da Vinci Code");
                values.put("author", "Dan Brown");
                values.put("pages", 454);
                values.put("price", 16.96);
                db.insert("Boook", null, values); // 插入第一条数据
                values.clear();
                // 组装第二条数据
                values.put("name", "The Lost Symbol");
                values.put("author", "Dan Brown");
                values.put("pages", 510);
                values.put("price", 19.95);
                db.insert("Book", null, values); // 插入第二条数据
            }
        });

  按钮的点击事件里面,先获取到了 SQLiteDatabase 对象,然后使用 ContentValues 来对要添加的数据进行组装。然后调用 insert() 方法将数据添加到表中。

 

更新数据

update() 方法,4个参数:1-表名,2-ContentValues对象,3、4-约束更新某一行或某几行中的数据,不指定的话默认更新所有

修改 activity_main.xml 提加按钮

<Button
        android:id="@+id/update_data"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="update data" />

修改 MainActivity.java,添加点击事件

Button updateData = (Button) 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", 10.99);
        db.update("Book", values, "name = ?", new String[]{"The Da Vinci Code"});
    }
});

构建了一个 ContentValues 对象,指定了一组数据,只想把价格这一列的数据更新成 10.99。然后调用 SQLiteDatabase 的 update() 方法去执行具体的更新操作,第三个参数对应的是 SQL语句的 where 部分,表示更新所有 name = ?的行,而 ?是一个占位符,可以通过第四个参数提供的一个字符串数组为第三个参数中的每个占位符指定相应的内容。

 

删除数据

delete()方法,接收3个参数:1-表名,2、3-约束删除某一行或某几行的数据,不指定默认就是删除所有行。

修改 activity_main.xml

<Button
        android:id="@+id/delete_data"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Delete data" />

修改 MainActivity.java,添加按钮点击事件

Button deleteButton = (Button) findViewById(R.id.delete_data);
deleteButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        SQLiteDatabase db = dbHelper.getWritableDatabase();
        db.delete("Book", "pages > ?", new String[] { "500" });
    }
});

  指明删除 Book 表中的数据,指定仅删除 页数超过 500页 的书

 

查询数据

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值