Android内置数据库SQLite

Android为我们提供了一个SQLiteOpenHelper帮助类来帮助我们方便地管理数据库。不过SQLiteOpenHelper是一个抽象类,我们需要建立一个自己的类去继承它,并且重写它的onCreate(),onUpgrade()方法,在这两个方法里面去写创建,升级数据库的逻辑。

getReadableDatabase(),getwriteableDatabase()都可以创建或者打开一个现有的数据库(如果数据库已经存在则直接打开,否则就自己创建一个数据库),不过,当数据库不可写入的时候,getReadableDatabase()方法只能以只读的方式打开数据库,而getwriteableDatabase()方法将会出现错误。

public class MyDatabaseHelper extends SQLiteOpenHelper {
    public static final String CREAT_BOOK="creat 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);
        this.mContext = mContext;
    }
    @Override
    public void onCreate(SQLiteDatabase db){
        db.execSQL(CREAT_BOOK);
        Toast.makeText(mContext,"Create suceeded",Toast.LENGTH_SHORT).show();
    }
    @Override
    public void onUpgrade(SQLiteDatabase db,int oldVersion,int newVersion){

    }
}

这里,我新建一个MyDatabaseHelper类继承SQLiteOpenHelper抽象类,并且重写了一个构造方法。这里我简单说下构造方法里面的各个参数:第一个是Context,第二个是数据库的名字,第三个是参数允许我们在查询数据时返回一个Cursor,一般传入null,第四个参数表示数据库的版本号;这里我们还把建表语句定义成一个字符串常量;接着我们在onCreate()方法里面调用execSQL()方法去执行这条建表语句,弹出一个Toast.

贴上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="wrap_content">

    <Button
        android:id="@+id/create_database"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Create database"/>
  </LinearLayout>

贴上MainActivity中的代码

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(getApplicationContext(),"BookStore",null,1);
        Button createDatabase=(Button)findViewById(R.id.create_database);
        createDatabase.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                dbHelper.getReadableDatabase();
            }
        });
      }
}

这样运行之后,数据库就建立成功了。

数据库的升级

在上文中,我们并没有在MyDatabaseHelper中重写onUpgrade()方法,这个方法是用于对数据库的升级的。

接下来,我们需要往数据库里面再添加一个表,在MyDatabaseHelper里面添加

public static final String CREATE_CATEGORY="create table Category("
            +"id integer primary key autoincrement,"
            +"category_name text,"
            +"category_code integer)";
@Override
    public void onCreate(SQLiteDatabase db){
        db.execSQL(CREAT_BOOK);
        db.execSQL(CREATE_CATEGORY);

       Toast.makeText(mContext,"Create suceeded",Toast.LENGTH_SHORT).show();
    }

不过如果我们已经运行过上面的例子之后,那么此时我们再次运行可能发现我们结果并不会像我们想的那样,什么原因呢?原因在于此时已经存在数据库了(我们第一次运行创建的数据库)。所以我们点击Button按钮,MyDatabaseHelper里面的onCreate()方法都不会再执行了。这时候我们就需要运行SQLiteOpenHelper的升级功能了。修改代码如下

@Override
    public void onCreate(SQLiteDatabase db){
        db.execSQL(CREAT_BOOK);
        db.execSQL(CREATE_CATEGORY);

        Toast.makeText(mContext,"Create suceeded",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()方法。

如何让onUpgrade()方法执行了,这里我们只需要在MainActivity里面把MyDatabaseHelper()构造方法里面最后一个参数传入一个比原先版本号大的数字就可以了。

发布了37 篇原创文章 · 获赞 10 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/OneLinee/article/details/78639135