Android 第十一课 SQlite 数据库存储

Android 为了让我们能够更加方便的管理数据库,特意提供了一个SQLiteOpenHelper帮助类,通过借助这个类就可以非常简单的对数据库进行创建和升级。

SQLiteOpenHelper是一个抽象类,我们要创建一个自己的帮助类去继承它。SQLiteOpenHelper有两个抽象方法,分别是onCreat()和onUpgrade(),我们必须在自己的帮助类里面重这两个方法,然后分别在这两个方法中去实现创建、升级数据库的逻辑。

SQLiteOpenHelper中还有两个非常重要的实例方法:getReadableDatabase()和getWritableDatabase()。这两个方法都可以创建或打开一个现有的数据库,并返回一个可对数据库进行读写操作的对象。不同的是,当数据不可写入的时候(如磁盘已满),getReadableDatabase()方法返回的对象将以只可读的方式去打开数据库,而getWriteableDatabase()方法将出现异常。

    SQLiteOpenHelper中有两个构造方法可供重写,一般使用参数少一点的构造方法即可。

这个构造方法中接收4个参数,第一个参数是Context,第二个参数是数据库名,创建数据库时使用的就是这里指定的名称。第三个参数允许我们在查询数据的时候返回一个自定义的Cursor,一般都是传入null。第四个参数表示当前数据库的版本号。

构建出SQLiteOpenHelper的实例之后,再调用他的getReadableDatabase()或getWritableDatabase()方法就能够创建数据库了。数据库文件通常会放在/data/data/<pack name>/database/目录下。此时,重写的onCreate()方法也会得到执行。所以通常会在这里去处理一些创建表的逻辑。

新建项目DatabaseTest。

我们希望创建一个名为BookStore.db的数据库,然后在这个数据库中新建一张Book表,表中包含主键id、作者、价格、页数和书名等列。创建数据库表当然还是需要用建表语句的。

新建MyDatabaseHelper类继承SQLiteOpenHelper,代码如下:

package com.example.databasetest;

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

/**
 * Created by ZHJ on 2018/3/3.
 */

public class MyDatabaseHelper extends SQLiteOpenHelper {
    public static final String CREATE_BOOK ="create table Book("
            +"id integer primary key autoincrement,"
            +"auto 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) {
        
    }
}

我们把建表语句定义为一个字符串常量,然后在Oncreate()方法中又调用了SQLiteDatabase的execSQL()方法去执行这条建表语句,并弹出一个Toast提示创建成功,这样我们在保证创建数据库的同时还是成功创建Book表。

修改activity_main.xml的代码,如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    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>

仅仅加入一个按钮,用于创建数据库。最后修改MainActivity中的代码,如下:

package com.example.databasetest;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

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 view) {
                dbHelper.getWritableDatabase();
            }
        });
    }
}

我们在onCreate()方法中构建了一个MyDatabaseHelper对象,并且通过构造函数的参数将数据库指定为BookStore.db,版本号指定为1,然后在Create database按钮的点击事件里面调用了getWritableDatabase()方法,这样,当第一次点击Create database按钮时,就会检测到当前程序中并没有BookStore.db这个数据库于是会创建数据库并调用MyDatabaseHelper中的onCreate()方法,这样Book表也就得到了创建,然后会弹出一个Toast提示创建成功。再次点击Create database按钮时,会发现此时已经存在BookStore.db数据库了,不会再创建一次。

现在可以运行一下代码。

怎么样才能证明数据库已经创建成功了呢?

我们使用adb shell 来对数据库和表的创建情况进行检查。









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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值