/我挥舞着键盘和本子,发誓要把世界写个明明白白/

安卓提供了三种数据持久化技术,分别为:文件存储、SharedPreference、数据库存储。

三、数据库存储

前面所学的文件存储和SharedPreferences存储只适用于去保持一些简单的数据和键值对,当需要存储大量复杂的关系型数据时,二者就显得力不从心了。这时,该是数据库存储上马表现的时候了。

1)Android系统内置了一款轻量级的数据库SQLite,为了方便管理,专门提供了一个SQLiteOpenHelper帮助类,这个类是一个抽象类,意味着我们如果想要使用它,就需要创建一个自己的帮助类去继承它。SQLiteOpenHelper中有两个抽象方法,分别是onCreate()和onUpgrade(),我们必须在自己的帮助类里面重写这两个方法,然后分别在这两个方法中去实现创建、升级数据库的逻辑。
2)SQLiteOpenHelper中还有两个非常重要的实例方法,getReadableDatabase()和getWritableDatabase()。这两个方法都可以创建或打开一个现有的数据库(如果数据库已存在则直接打开,否则创建一个新的数据库),并返回一个可对数据库进行读写操作的对象。
3)SQLiteOpenHelper中有两个构造方法可供重写,选择参数少点的那个。这个方法接收四个参数,分别为Context、数据库名、Cursor、版本号。构建出SQLiteOpenHelper的实例之后,再调用它的getReadableDatabase()或getWritableDatabase()方法就能够创建数据库了,数据库文件放在/data/data//databases/目录下。

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

package com.example.databasetest;

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

public class MyDatabaseHelper extends SQLiteOpenHelper {
public static final String CREATE_BOOK="create table Book ("  //建表语句定义成了一个字符串常量
        +",in integer primary key autoincrement,"
        +"author text,"
        +"price real,"
        +"pages integer,"
        +"name text)";
        private Context mContext;
        public MyDatabaseHelper(Context context,String name,CursorFactory factory,int version){
            super(context,name,factory,version);
            mContext=context;
        }
        @Override
        public void onCreate(SQLiteDatabase db) {
            db.execSQL(CREATE_BOOK);     //调用SQLiteDatabase的execSQL()方法执行建表
            Toast.makeText(mContext, "Create succeeded", Toast.LENGTH_SHORT).show(); //弹出一个Toast提示Book表创建成功
        }
        @Override
        public void onUpgrade(SQLiteDatabase db ,int oldVersion,int newVersion){} //onUpgrade()方法是用于对数据库进行升级的
}

接下来修改布局文件activity_main.xml中的代码,代码如下:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <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.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity {
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); //构建了一个MyDatabaseHelper对象,数据库名称指定为BookStore.db,版本号指定为1
    Button createDatabase=(Button) findViewById(R.id.create_database);
    createDatabase.setOnClickListener(new OnClickListener(){
        @Override
        public void onClick(View v){
            dbHelper.getWritableDatabase(); //当第一次点击Create database按钮时,就会检测到当前程序中并没有BookStore.db这个数据库,于是会创建该数据库并调用MyDatabaseHelper中的onCreate()方法,这样Book表也就得到了创建。
        }
    });
}
}